diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 65f558e..656a2ef 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.0.0" + ".": "2.1.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 96e30e1..265ca1f 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 43 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/imagekit-inc%2Fimagekit-c7ad6f552b38f2145781847f8b390fa1ec43068d64e45a33012a97a9299edc10.yml -openapi_spec_hash: 50f281e91210ad5018ac7e4eee216f56 -config_hash: 74a8263b80c732a2b016177e7d56bb9c +configured_endpoints: 48 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/imagekit-inc%2Fimagekit-c028a7584d3508f268ce5c5b824b50af88eaa140620dd03a1b35f409f510603c.yml +openapi_spec_hash: f9b780b2398a87678a13355e48cd515f +config_hash: aeb6eb949d73382270bbd8bbf2e4cf2a diff --git a/CHANGELOG.md b/CHANGELOG.md index 488241b..5d1b11c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,48 @@ # Changelog +## 2.1.0 (2026-01-16) + +Full Changelog: [v2.0.0...v2.1.0](https://github.com/imagekit-developer/imagekit-go/compare/v2.0.0...v2.1.0) + +### Features + +* **api:** add GetImageAttributesOptions and ResponsiveImageAttributes schemas; update resource references in main.yaml; remove dummy endpoint ([41072da](https://github.com/imagekit-developer/imagekit-go/commit/41072da63cd2ba891a911d932af3bc8b70c90588)) +* **api:** Add saved extensions API and enhance transformation options ([1f7e772](https://github.com/imagekit-developer/imagekit-go/commit/1f7e7723cb74828044a489d0b2de58b195b05183)) +* **api:** fix go sdk breaking changes ([6cbddff](https://github.com/imagekit-developer/imagekit-go/commit/6cbddffab95c89b964fc29ce119ceb70d7ebded5)) +* **encoder:** support bracket encoding form-data object members ([cb3e557](https://github.com/imagekit-developer/imagekit-go/commit/cb3e5572b00fe978ee93d595cc4d8775edccbc89)) +* **tests:** add transformations for radius, color replace, and distort; enhance overlay tests with layer modes ([382b9ed](https://github.com/imagekit-developer/imagekit-go/commit/382b9ed5e05f5fb1810481c0fd5a2299bbf5cfde)) + + +### Bug Fixes + +* add ai-tasks property to response schemas with enum values ([0551693](https://github.com/imagekit-developer/imagekit-go/commit/0551693b9a7eeb35984c198046e80a6a9debdbf8)) +* **client:** correctly specify Accept header with */* instead of empty ([21a30a4](https://github.com/imagekit-developer/imagekit-go/commit/21a30a4d60b4b2da84d2314ddf6bcf76759da64d)) +* **client:** invalid URL ([aea74b3](https://github.com/imagekit-developer/imagekit-go/commit/aea74b387869ce1fa566bf7a1fda3b2432eff9a9)) +* **client:** properly marshal embedded structs ([e55e614](https://github.com/imagekit-developer/imagekit-go/commit/e55e614fab629dfab68d7249e53ef602dd1a36b3)) +* **docs:** update go get command to include version path in README.md ([d7d4c82](https://github.com/imagekit-developer/imagekit-go/commit/d7d4c829ebccafd1242d79a03651f1189c9f24d0)) +* **mcp:** correct code tool API endpoint ([b32395e](https://github.com/imagekit-developer/imagekit-go/commit/b32395e36a3fdd2f8e37313a303a68135f13400f)) +* rename param to avoid collision ([5067fd4](https://github.com/imagekit-developer/imagekit-go/commit/5067fd4adfe3a7108f3799f270c4211ade385882)) +* skip usage tests that don't work with Prism ([429ad75](https://github.com/imagekit-developer/imagekit-go/commit/429ad75eb8c267b44a9c8e4f2c542344189563e3)) + + +### Chores + +* add float64 to valid types for RegisterFieldValidator ([2dc3cae](https://github.com/imagekit-developer/imagekit-go/commit/2dc3cae63386dc6b8c7743af3fdb0a9c4ed93ef5)) +* bump gjson version ([87ad44d](https://github.com/imagekit-developer/imagekit-go/commit/87ad44d7016dcb641158e26cc4f0d08e89770dc5)) +* elide duplicate aliases ([2f9eee1](https://github.com/imagekit-developer/imagekit-go/commit/2f9eee11c82bd0b6641dec1f0c20042863ad169f)) +* **internal:** codegen related update ([23edba8](https://github.com/imagekit-developer/imagekit-go/commit/23edba82802b3bc322649f9693ff71134db70b5c)) +* **internal:** codegen related update ([2fdd961](https://github.com/imagekit-developer/imagekit-go/commit/2fdd961c6a458140239af2e88cf1b1ecf7dc27f2)) +* **internal:** codegen related update ([8877b4f](https://github.com/imagekit-developer/imagekit-go/commit/8877b4fbdce39a56785613a1172dda44399c6fe7)) +* **internal:** codegen related update ([d83769d](https://github.com/imagekit-developer/imagekit-go/commit/d83769df0486737f479694acc9421415fb11c523)) +* **internal:** codegen related update ([63165ac](https://github.com/imagekit-developer/imagekit-go/commit/63165ac51ec10df842ed8f9496c82294b4f9e61e)) +* **internal:** grammar fix (it's -> its) ([e35e192](https://github.com/imagekit-developer/imagekit-go/commit/e35e1922f7ad2541ed116db557bcedd8c9c088de)) +* remove MCP Server section from README.md ([58749a4](https://github.com/imagekit-developer/imagekit-go/commit/58749a446146fc365b10ced5db1556eb5dbd1de3)) + + +### Documentation + +* prominently feature MCP server setup in root SDK readmes ([e2a2d90](https://github.com/imagekit-developer/imagekit-go/commit/e2a2d9047c24a8fd32471aaf96315cad0bd9f935)) + ## 2.0.0 (2025-10-05) Full Changelog: [v0.0.1...v2.0.0](https://github.com/imagekit-developer/imagekit-go/compare/v0.0.1...v2.0.0) diff --git a/LICENSE b/LICENSE index e7a4d16..2027861 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2025 Image Kit + Copyright 2026 Image Kit Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 58286aa..9e5488d 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ Or to pin the version: ```sh -go get -u 'github.com/imagekit-developer/imagekit-go@v2.0.0' +go get -u 'github.com/imagekit-developer/imagekit-go/v2@v2.1.0' ``` @@ -167,7 +167,7 @@ custom := param.Override[imagekit.FooParams](12) ### Request unions -Unions are represented as a struct with fields prefixed by "Of" for each of it's variants, +Unions are represented as a struct with fields prefixed by "Of" for each of its variants, only one field can be non-zero. The non-zero field will be serialized. Sub-properties of the union can be accessed via methods on the union struct. diff --git a/accountorigin.go b/accountorigin.go index 79a8d4a..52888b2 100644 --- a/accountorigin.go +++ b/accountorigin.go @@ -74,7 +74,7 @@ func (r *AccountOriginService) List(ctx context.Context, opts ...option.RequestO // any URL‑endpoints, the API will return an error. func (r *AccountOriginService) Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error) { opts = slices.Concat(r.Options, opts) - opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...) + opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...) if id == "" { err = errors.New("missing required id parameter") return diff --git a/accounturlendpoint.go b/accounturlendpoint.go index 7991a84..dbd0224 100644 --- a/accounturlendpoint.go +++ b/accounturlendpoint.go @@ -75,7 +75,7 @@ func (r *AccountURLEndpointService) List(ctx context.Context, opts ...option.Req // URL‑endpoint created by ImageKit during account creation. func (r *AccountURLEndpointService) Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error) { opts = slices.Concat(r.Options, opts) - opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...) + opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...) if id == "" { err = errors.New("missing required id parameter") return diff --git a/aliases.go b/aliases.go index be8fe53..a960812 100644 --- a/aliases.go +++ b/aliases.go @@ -19,6 +19,234 @@ type Error = apierror.Error // This is an alias to an internal type. type BaseOverlayParam = shared.BaseOverlayParam +// Controls how the layer blends with the base image or underlying content. Maps to +// `lm` in the URL. By default, layers completely cover the base image beneath +// them. Layer modes change this behavior: +// +// - `multiply`: Multiplies the pixel values of the layer with the base image. The +// result is always darker than the original images. This is ideal for applying +// shadows or color tints. +// - `displace`: Uses the layer as a displacement map to distort pixels in the base +// image. The red channel controls horizontal displacement, and the green channel +// controls vertical displacement. Requires `x` or `y` parameter to control +// displacement magnitude. +// - `cutout`: Acts as an inverse mask where opaque areas of the layer turn the +// base image transparent, while transparent areas leave the base image +// unchanged. This mode functions like a hole-punch, effectively cutting the +// shape of the layer out of the underlying image. +// - `cutter`: Acts as a shape mask where only the parts of the base image that +// fall inside the opaque area of the layer are preserved. This mode functions +// like a cookie-cutter, trimming the base image to match the specific dimensions +// and shape of the layer. See +// [Layer modes](https://imagekit.io/docs/add-overlays-on-images#layer-modes). +// +// This is an alias to an internal type. +type BaseOverlayLayerMode = shared.BaseOverlayLayerMode + +// Equals "multiply" +const BaseOverlayLayerModeMultiply = shared.BaseOverlayLayerModeMultiply + +// Equals "cutter" +const BaseOverlayLayerModeCutter = shared.BaseOverlayLayerModeCutter + +// Equals "cutout" +const BaseOverlayLayerModeCutout = shared.BaseOverlayLayerModeCutout + +// Equals "displace" +const BaseOverlayLayerModeDisplace = shared.BaseOverlayLayerModeDisplace + +// Configuration object for an extension (base extensions only, not saved extension +// references). +// +// This is an alias to an internal type. +type ExtensionConfigUnion = shared.ExtensionConfigUnion + +// This is an alias to an internal type. +type ExtensionConfigRemoveBg = shared.ExtensionConfigRemoveBg + +// This is an alias to an internal type. +type ExtensionConfigRemoveBgOptions = shared.ExtensionConfigRemoveBgOptions + +// This is an alias to an internal type. +type ExtensionConfigAutoTagging = shared.ExtensionConfigAutoTagging + +// This is an alias to an internal type. +type ExtensionConfigAIAutoDescription = shared.ExtensionConfigAIAutoDescription + +// This is an alias to an internal type. +type ExtensionConfigAITasks = shared.ExtensionConfigAITasks + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskUnion = shared.ExtensionConfigAITasksTaskUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskSelectTags = shared.ExtensionConfigAITasksTaskSelectTags + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskSelectMetadata = shared.ExtensionConfigAITasksTaskSelectMetadata + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion = shared.ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNo = shared.ExtensionConfigAITasksTaskYesNo + +// Actions to execute if the AI answers no. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNo = shared.ExtensionConfigAITasksTaskYesNoOnNo + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadata + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata + +// Actions to execute if the AI cannot determine the answer. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknown = shared.ExtensionConfigAITasksTaskYesNoOnUnknown + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata + +// Actions to execute if the AI answers yes. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYes = shared.ExtensionConfigAITasksTaskYesNoOnYes + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadata + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata + +// Configuration object for an extension (base extensions only, not saved extension +// references). +// +// This is an alias to an internal type. +type ExtensionConfigUnionParam = shared.ExtensionConfigUnionParam + +// This is an alias to an internal type. +type ExtensionConfigRemoveBgParam = shared.ExtensionConfigRemoveBgParam + +// This is an alias to an internal type. +type ExtensionConfigRemoveBgOptionsParam = shared.ExtensionConfigRemoveBgOptionsParam + +// This is an alias to an internal type. +type ExtensionConfigAutoTaggingParam = shared.ExtensionConfigAutoTaggingParam + +// This is an alias to an internal type. +type ExtensionConfigAIAutoDescriptionParam = shared.ExtensionConfigAIAutoDescriptionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksParam = shared.ExtensionConfigAITasksParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskUnionParam = shared.ExtensionConfigAITasksTaskUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskSelectTagsParam = shared.ExtensionConfigAITasksTaskSelectTagsParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskSelectMetadataParam = shared.ExtensionConfigAITasksTaskSelectMetadataParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam = shared.ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoParam = shared.ExtensionConfigAITasksTaskYesNoParam + +// Actions to execute if the AI answers no. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoParam = shared.ExtensionConfigAITasksTaskYesNoOnNoParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam + +// Actions to execute if the AI cannot determine the answer. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam + +// Actions to execute if the AI answers yes. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesParam = shared.ExtensionConfigAITasksTaskYesNoOnYesParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam + +// This is an alias to an internal type. +type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam + // Array of extensions to be applied to the asset. Each extension can be configured // with specific parameters based on the extension type. // @@ -40,6 +268,94 @@ type ExtensionAutoTaggingParam = shared.ExtensionAutoTaggingParam // This is an alias to an internal type. type ExtensionAIAutoDescriptionParam = shared.ExtensionAIAutoDescriptionParam +// This is an alias to an internal type. +type ExtensionAITasksParam = shared.ExtensionAITasksParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskUnionParam = shared.ExtensionAITasksTaskUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskSelectTagsParam = shared.ExtensionAITasksTaskSelectTagsParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskSelectMetadataParam = shared.ExtensionAITasksTaskSelectMetadataParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskSelectMetadataVocabularyUnionParam = shared.ExtensionAITasksTaskSelectMetadataVocabularyUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoParam = shared.ExtensionAITasksTaskYesNoParam + +// Actions to execute if the AI answers no. +// +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnNoParam = shared.ExtensionAITasksTaskYesNoOnNoParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnNoSetMetadataParam = shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam = shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam = shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam = shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam + +// Actions to execute if the AI cannot determine the answer. +// +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnUnknownParam = shared.ExtensionAITasksTaskYesNoOnUnknownParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam = shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam = shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam = shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam = shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam + +// Actions to execute if the AI answers yes. +// +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnYesParam = shared.ExtensionAITasksTaskYesNoOnYesParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnYesSetMetadataParam = shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam + +// Value to set for the custom metadata field. The value type should match the +// custom metadata field type. +// +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam = shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam = shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam + +// This is an alias to an internal type. +type ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam = shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam + +// This is an alias to an internal type. +type ExtensionSavedExtensionParam = shared.ExtensionSavedExtensionParam + +// Options for generating responsive image attributes including `src`, `srcSet`, +// and `sizes` for HTML `` elements. This schema extends `SrcOptions` to add +// support for responsive image generation with breakpoints. +// +// This is an alias to an internal type. +type GetImageAttributesOptionsParam = shared.GetImageAttributesOptionsParam + // This is an alias to an internal type. type ImageOverlayParam = shared.ImageOverlayParam @@ -133,6 +449,22 @@ type OverlayTimingEndUnionParam = shared.OverlayTimingEndUnionParam // This is an alias to an internal type. type OverlayTimingStartUnionParam = shared.OverlayTimingStartUnionParam +// Resulting set of attributes suitable for an HTML `` element. Useful for +// enabling responsive image loading with `srcSet` and `sizes`. +// +// This is an alias to an internal type. +type ResponsiveImageAttributesParam = shared.ResponsiveImageAttributesParam + +// Saved extension object containing extension configuration. +// +// This is an alias to an internal type. +type SavedExtension = shared.SavedExtension + +// Saved extension object containing extension configuration. +// +// This is an alias to an internal type. +type SavedExtensionParam = shared.SavedExtensionParam + // This is an alias to an internal type. type SolidColorOverlayParam = shared.SolidColorOverlayParam @@ -157,9 +489,14 @@ type SolidColorOverlayTransformationGradientBoolean = shared.SolidColorOverlayTr // This is an alias to an internal type. type SolidColorOverlayTransformationHeightUnionParam = shared.SolidColorOverlayTransformationHeightUnionParam -// Specifies the corner radius of the solid color overlay. Set to `max` for -// circular or oval shape. See -// [radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). +// Specifies the corner radius of the solid color overlay. +// +// - Single value (positive integer): Applied to all corners (e.g., `20`). +// - `max`: Creates a circular or oval shape. +// - Per-corner array: Provide four underscore-separated values representing +// top-left, top-right, bottom-right, and bottom-left corners respectively (e.g., +// `10_20_30_40`). See +// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). // // This is an alias to an internal type. type SolidColorOverlayTransformationRadiusUnionParam = shared.SolidColorOverlayTransformationRadiusUnionParam @@ -237,7 +574,9 @@ type TextOverlayParam = shared.TextOverlayParam // This is an alias to an internal type. type TextOverlayTransformationParam = shared.TextOverlayTransformationParam -// Flip the text overlay horizontally, vertically, or both. +// Flip/mirror the text horizontally, vertically, or in both directions. Acceptable +// values: `h` (horizontal), `v` (vertical), `h_v` (horizontal and vertical), or +// `v_h`. // // This is an alias to an internal type. type TextOverlayTransformationFlip = shared.TextOverlayTransformationFlip @@ -275,10 +614,9 @@ const TextOverlayTransformationInnerAlignmentRight = shared.TextOverlayTransform // Equals "center" const TextOverlayTransformationInnerAlignmentCenter = shared.TextOverlayTransformationInnerAlignmentCenter -// Specifies the line height of the text overlay. Accepts integer values -// representing line height in points. It can also accept -// [arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations) -// such as `bw_mul_0.2`, or `bh_div_20`. +// Specifies the line height for multi-line text overlays. It will come into effect +// only if the text wraps over multiple lines. Accepts either an integer value or +// an arithmetic expression. // // This is an alias to an internal type. type TextOverlayTransformationLineHeightUnionParam = shared.TextOverlayTransformationLineHeightUnionParam @@ -290,8 +628,14 @@ type TextOverlayTransformationLineHeightUnionParam = shared.TextOverlayTransform // This is an alias to an internal type. type TextOverlayTransformationPaddingUnionParam = shared.TextOverlayTransformationPaddingUnionParam -// Specifies the corner radius of the text overlay. Set to `max` to achieve a -// circular or oval shape. +// Specifies the corner radius: +// +// - Single value (positive integer): Applied to all corners (e.g., `20`). +// - `max`: Creates a circular or oval shape. +// - Per-corner array: Provide four underscore-separated values representing +// top-left, top-right, bottom-right, and bottom-left corners respectively (e.g., +// `10_20_30_40`). See +// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). // // This is an alias to an internal type. type TextOverlayTransformationRadiusUnionParam = shared.TextOverlayTransformationRadiusUnionParam @@ -499,9 +843,14 @@ type TransformationHeightUnionParam = shared.TransformationHeightUnionParam // This is an alias to an internal type. type TransformationPageUnionParam = shared.TransformationPageUnionParam -// Specifies the corner radius for rounded corners (e.g., 20) or `max` for circular -// or oval shape. See -// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). +// Specifies the corner radius for rounded corners. +// +// - Single value (positive integer): Applied to all corners (e.g., `20`). +// - `max`: Creates a circular or oval shape. +// - Per-corner array: Provide four underscore-separated values representing +// top-left, top-right, bottom-right, and bottom-left corners respectively (e.g., +// `10_20_30_40`). See +// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). // // This is an alias to an internal type. type TransformationRadiusUnionParam = shared.TransformationRadiusUnionParam diff --git a/api.md b/api.md index d1fe4eb..9291394 100644 --- a/api.md +++ b/api.md @@ -1,11 +1,15 @@ # Shared Params Types - shared.BaseOverlayParam +- shared.ExtensionConfigUnionParam - shared.ExtensionsParam +- shared.GetImageAttributesOptionsParam - shared.ImageOverlayParam - shared.OverlayUnionParam - shared.OverlayPositionParam - shared.OverlayTimingParam +- shared.ResponsiveImageAttributesParam +- shared.SavedExtensionParam - shared.SolidColorOverlayParam - shared.SolidColorOverlayTransformationParam - shared.SrcOptionsParam @@ -18,6 +22,12 @@ - shared.TransformationPosition - shared.VideoOverlayParam +# Shared Response Types + +- shared.ExtensionConfigUnion +- shared.SavedExtension + + # CustomMetadataFields Response Types: @@ -93,7 +103,17 @@ Methods: Methods: - client.Files.Metadata.Get(ctx context.Context, fileID string) (imagekit.Metadata, error) -- client.Files.Metadata.GetFromURL(ctx context.Context, query imagekit.FileMetadataGetFromURLParams) (imagekit.Metadata, error) +- client.Files.Metadata.GetFromURL(ctx context.Context, query imagekit.FileMetadataGetFromURLParams) (imagekit.Metadata, error) + +# SavedExtensions + +Methods: + +- client.SavedExtensions.New(ctx context.Context, body imagekit.SavedExtensionNewParams) (shared.SavedExtension, error) +- client.SavedExtensions.Update(ctx context.Context, id string, body imagekit.SavedExtensionUpdateParams) (shared.SavedExtension, error) +- client.SavedExtensions.List(ctx context.Context) ([]shared.SavedExtension, error) +- client.SavedExtensions.Delete(ctx context.Context, id string) error +- client.SavedExtensions.Get(ctx context.Context, id string) (shared.SavedExtension, error) # Assets diff --git a/betav2file.go b/betav2file.go index c5e327a..5417572 100644 --- a/betav2file.go +++ b/betav2file.go @@ -238,6 +238,8 @@ type BetaV2FileUploadResponseExtensionStatus struct { // Any of "success", "pending", "failed". AIAutoDescription string `json:"ai-auto-description"` // Any of "success", "pending", "failed". + AITasks string `json:"ai-tasks"` + // Any of "success", "pending", "failed". AwsAutoTagging string `json:"aws-auto-tagging"` // Any of "success", "pending", "failed". GoogleAutoTagging string `json:"google-auto-tagging"` @@ -246,6 +248,7 @@ type BetaV2FileUploadResponseExtensionStatus struct { // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. JSON struct { AIAutoDescription respjson.Field + AITasks respjson.Field AwsAutoTagging respjson.Field GoogleAutoTagging respjson.Field RemoveBg respjson.Field diff --git a/betav2file_test.go b/betav2file_test.go index 3303619..c918e12 100644 --- a/betav2file_test.go +++ b/betav2file_test.go @@ -58,6 +58,64 @@ func TestBetaV2FileUploadWithOptionalParams(t *testing.T) { }, }, shared.ExtensionUnionParam{ OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{}, + }, shared.ExtensionUnionParam{ + OfAITasks: &shared.ExtensionAITasksParam{ + Tasks: []shared.ExtensionAITasksTaskUnionParam{{ + OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{ + Instruction: "What types of clothing items are visible in this image?", + Vocabulary: []string{"shirt", "tshirt", "dress", "trousers", "jacket"}, + MaxSelections: imagekit.Int(1), + MinSelections: imagekit.Int(0), + }, + }, { + OfYesNo: &shared.ExtensionAITasksTaskYesNoParam{ + Instruction: "Is this a luxury or high-end fashion item?", + OnNo: shared.ExtensionAITasksTaskYesNoOnNoParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + OnUnknown: shared.ExtensionAITasksTaskYesNoOnUnknownParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + OnYes: shared.ExtensionAITasksTaskYesNoOnYesParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + }, + }}, + }, + }, shared.ExtensionUnionParam{ + OfSavedExtension: &shared.ExtensionSavedExtensionParam{ + ID: "ext_abc123", + }, }}, Folder: imagekit.String("folder"), IsPrivateFile: imagekit.Bool(true), diff --git a/client.go b/client.go index f53998f..9d76257 100644 --- a/client.go +++ b/client.go @@ -21,6 +21,7 @@ type Client struct { Dummy DummyService CustomMetadataFields CustomMetadataFieldService Files FileService + SavedExtensions SavedExtensionService Assets AssetService Cache CacheService Folders FolderService @@ -64,6 +65,7 @@ func NewClient(opts ...option.RequestOption) (r Client) { r.Dummy = NewDummyService(opts...) r.CustomMetadataFields = NewCustomMetadataFieldService(opts...) r.Files = NewFileService(opts...) + r.SavedExtensions = NewSavedExtensionService(opts...) r.Assets = NewAssetService(opts...) r.Cache = NewCacheService(opts...) r.Folders = NewFolderService(opts...) diff --git a/dummy.go b/dummy.go index 9f26efb..5af366d 100644 --- a/dummy.go +++ b/dummy.go @@ -38,7 +38,7 @@ func NewDummyService(opts ...option.RequestOption) (r DummyService) { // and is not intended for public consumption. func (r *DummyService) New(ctx context.Context, body DummyNewParams, opts ...option.RequestOption) (err error) { opts = slices.Concat(r.Options, opts) - opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...) + opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...) path := "v1/dummy/test" err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, nil, opts...) return @@ -46,17 +46,29 @@ func (r *DummyService) New(ctx context.Context, body DummyNewParams, opts ...opt type DummyNewParams struct { BaseOverlay shared.BaseOverlayParam `json:"baseOverlay,omitzero"` + // Configuration object for an extension (base extensions only, not saved extension + // references). + ExtensionConfig shared.ExtensionConfigUnionParam `json:"extensionConfig,omitzero"` // Array of extensions to be applied to the asset. Each extension can be configured // with specific parameters based on the extension type. - Extensions shared.ExtensionsParam `json:"extensions,omitzero"` - ImageOverlay shared.ImageOverlayParam `json:"imageOverlay,omitzero"` + Extensions shared.ExtensionsParam `json:"extensions,omitzero"` + // Options for generating responsive image attributes including `src`, `srcSet`, + // and `sizes` for HTML `` elements. This schema extends `SrcOptions` to add + // support for responsive image generation with breakpoints. + GetImageAttributesOptions shared.GetImageAttributesOptionsParam `json:"getImageAttributesOptions,omitzero"` + ImageOverlay shared.ImageOverlayParam `json:"imageOverlay,omitzero"` // Specifies an overlay to be applied on the parent image or video. ImageKit // supports overlays including images, text, videos, subtitles, and solid colors. // See // [Overlay using layers](https://imagekit.io/docs/transformations#overlay-using-layers). - Overlay shared.OverlayUnionParam `json:"overlay,omitzero"` - OverlayPosition shared.OverlayPositionParam `json:"overlayPosition,omitzero"` - OverlayTiming shared.OverlayTimingParam `json:"overlayTiming,omitzero"` + Overlay shared.OverlayUnionParam `json:"overlay,omitzero"` + OverlayPosition shared.OverlayPositionParam `json:"overlayPosition,omitzero"` + OverlayTiming shared.OverlayTimingParam `json:"overlayTiming,omitzero"` + // Resulting set of attributes suitable for an HTML `` element. Useful for + // enabling responsive image loading with `srcSet` and `sizes`. + ResponsiveImageAttributes shared.ResponsiveImageAttributesParam `json:"responsiveImageAttributes,omitzero"` + // Saved extension object containing extension configuration. + SavedExtensions shared.SavedExtensionParam `json:"savedExtensions,omitzero"` SolidColorOverlay shared.SolidColorOverlayParam `json:"solidColorOverlay,omitzero"` SolidColorOverlayTransformation shared.SolidColorOverlayTransformationParam `json:"solidColorOverlayTransformation,omitzero"` // Options for generating ImageKit URLs with transformations. See the diff --git a/dummy_test.go b/dummy_test.go index 0548e6a..1d32061 100644 --- a/dummy_test.go +++ b/dummy_test.go @@ -7,6 +7,7 @@ import ( "errors" "os" "testing" + "time" "github.com/imagekit-developer/imagekit-go/v2" "github.com/imagekit-developer/imagekit-go/v2/internal/testutil" @@ -30,6 +31,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { ) err := client.Dummy.New(context.TODO(), imagekit.DummyNewParams{ BaseOverlay: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -51,6 +53,16 @@ func TestDummyNewWithOptionalParams(t *testing.T) { }, }, }, + ExtensionConfig: shared.ExtensionConfigUnionParam{ + OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{ + Options: shared.ExtensionConfigRemoveBgOptionsParam{ + AddShadow: imagekit.Bool(true), + BgColor: imagekit.String("bg_color"), + BgImageURL: imagekit.String("bg_image_url"), + Semitransparency: imagekit.Bool(true), + }, + }, + }, Extensions: shared.ExtensionsParam{shared.ExtensionUnionParam{ OfRemoveBg: &shared.ExtensionRemoveBgParam{ Options: shared.ExtensionRemoveBgOptionsParam{ @@ -68,9 +80,233 @@ func TestDummyNewWithOptionalParams(t *testing.T) { }, }, shared.ExtensionUnionParam{ OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{}, + }, shared.ExtensionUnionParam{ + OfAITasks: &shared.ExtensionAITasksParam{ + Tasks: []shared.ExtensionAITasksTaskUnionParam{{ + OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{ + Instruction: "What types of clothing items are visible in this image?", + Vocabulary: []string{"shirt", "tshirt", "dress", "trousers", "jacket"}, + MaxSelections: imagekit.Int(1), + MinSelections: imagekit.Int(0), + }, + }, { + OfYesNo: &shared.ExtensionAITasksTaskYesNoParam{ + Instruction: "Is this a luxury or high-end fashion item?", + OnNo: shared.ExtensionAITasksTaskYesNoOnNoParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + OnUnknown: shared.ExtensionAITasksTaskYesNoOnUnknownParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + OnYes: shared.ExtensionAITasksTaskYesNoOnYesParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + }, + }}, + }, + }, shared.ExtensionUnionParam{ + OfSavedExtension: &shared.ExtensionSavedExtensionParam{ + ID: "ext_abc123", + }, }}, + GetImageAttributesOptions: shared.GetImageAttributesOptionsParam{ + SrcOptionsParam: shared.SrcOptionsParam{ + Src: "/my-image.jpg", + URLEndpoint: "https://ik.imagekit.io/demo", + ExpiresIn: imagekit.Float(0), + QueryParameters: map[string]string{ + "foo": "string", + }, + Signed: imagekit.Bool(true), + Transformation: []shared.TransformationParam{{ + AIChangeBackground: imagekit.String("aiChangeBackground"), + AIDropShadow: shared.TransformationAIDropShadowUnionParam{ + OfTransformationAIDropShadowBoolean: imagekit.Bool(true), + }, + AIEdit: imagekit.String("aiEdit"), + AIRemoveBackground: true, + AIRemoveBackgroundExternal: true, + AIRetouch: true, + AIUpscale: true, + AIVariation: true, + AspectRatio: shared.TransformationAspectRatioUnionParam{ + OfString: imagekit.String("4:3"), + }, + AudioCodec: shared.TransformationAudioCodecAac, + Background: imagekit.String("red"), + Blur: imagekit.Float(10), + Border: imagekit.String("5_FF0000"), + ColorProfile: imagekit.Bool(true), + ColorReplace: imagekit.String("colorReplace"), + ContrastStretch: true, + Crop: shared.TransformationCropForce, + CropMode: shared.TransformationCropModePadResize, + DefaultImage: imagekit.String("defaultImage"), + Distort: imagekit.String("distort"), + Dpr: imagekit.Float(2), + Duration: shared.TransformationDurationUnionParam{ + OfFloat: imagekit.Float(0), + }, + EndOffset: shared.TransformationEndOffsetUnionParam{ + OfFloat: imagekit.Float(0), + }, + Flip: shared.TransformationFlipH, + Focus: imagekit.String("center"), + Format: shared.TransformationFormatAuto, + Gradient: shared.TransformationGradientUnionParam{ + OfTransformationGradientBoolean: imagekit.Bool(true), + }, + Grayscale: true, + Height: shared.TransformationHeightUnionParam{ + OfFloat: imagekit.Float(200), + }, + Lossless: imagekit.Bool(true), + Metadata: imagekit.Bool(true), + Named: imagekit.String("named"), + Opacity: imagekit.Float(0), + Original: imagekit.Bool(true), + Overlay: shared.OverlayUnionParam{ + OfText: &shared.TextOverlayParam{ + BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, + Position: shared.OverlayPositionParam{ + Focus: shared.OverlayPositionFocusCenter, + X: shared.OverlayPositionXUnionParam{ + OfFloat: imagekit.Float(0), + }, + Y: shared.OverlayPositionYUnionParam{ + OfFloat: imagekit.Float(0), + }, + }, + Timing: shared.OverlayTimingParam{ + Duration: shared.OverlayTimingDurationUnionParam{ + OfFloat: imagekit.Float(0), + }, + End: shared.OverlayTimingEndUnionParam{ + OfFloat: imagekit.Float(0), + }, + Start: shared.OverlayTimingStartUnionParam{ + OfFloat: imagekit.Float(0), + }, + }, + }, + Text: "text", + Encoding: "auto", + Transformation: []shared.TextOverlayTransformationParam{{ + Alpha: imagekit.Float(1), + Background: imagekit.String("background"), + Flip: shared.TextOverlayTransformationFlipH, + FontColor: imagekit.String("fontColor"), + FontFamily: imagekit.String("fontFamily"), + FontSize: shared.TextOverlayTransformationFontSizeUnionParam{ + OfFloat: imagekit.Float(0), + }, + InnerAlignment: shared.TextOverlayTransformationInnerAlignmentLeft, + LineHeight: shared.TextOverlayTransformationLineHeightUnionParam{ + OfFloat: imagekit.Float(0), + }, + Padding: shared.TextOverlayTransformationPaddingUnionParam{ + OfFloat: imagekit.Float(0), + }, + Radius: shared.TextOverlayTransformationRadiusUnionParam{ + OfFloat: imagekit.Float(0), + }, + Rotation: shared.TextOverlayTransformationRotationUnionParam{ + OfFloat: imagekit.Float(0), + }, + Typography: imagekit.String("typography"), + Width: shared.TextOverlayTransformationWidthUnionParam{ + OfFloat: imagekit.Float(0), + }, + }}, + }, + }, + Page: shared.TransformationPageUnionParam{ + OfFloat: imagekit.Float(0), + }, + Progressive: imagekit.Bool(true), + Quality: imagekit.Float(80), + Radius: shared.TransformationRadiusUnionParam{ + OfFloat: imagekit.Float(20), + }, + Raw: imagekit.String("raw"), + Rotation: shared.TransformationRotationUnionParam{ + OfFloat: imagekit.Float(90), + }, + Shadow: shared.TransformationShadowUnionParam{ + OfTransformationShadowBoolean: imagekit.Bool(true), + }, + Sharpen: shared.TransformationSharpenUnionParam{ + OfTransformationSharpenBoolean: imagekit.Bool(true), + }, + StartOffset: shared.TransformationStartOffsetUnionParam{ + OfFloat: imagekit.Float(0), + }, + StreamingResolutions: []shared.StreamingResolution{shared.StreamingResolution240}, + Trim: shared.TransformationTrimUnionParam{ + OfTransformationTrimBoolean: imagekit.Bool(true), + }, + UnsharpMask: shared.TransformationUnsharpMaskUnionParam{ + OfTransformationUnsharpMaskBoolean: imagekit.Bool(true), + }, + VideoCodec: shared.TransformationVideoCodecH264, + Width: shared.TransformationWidthUnionParam{ + OfFloat: imagekit.Float(300), + }, + X: shared.TransformationXUnionParam{ + OfFloat: imagekit.Float(0), + }, + XCenter: shared.TransformationXCenterUnionParam{ + OfFloat: imagekit.Float(0), + }, + Y: shared.TransformationYUnionParam{ + OfFloat: imagekit.Float(0), + }, + YCenter: shared.TransformationYCenterUnionParam{ + OfFloat: imagekit.Float(0), + }, + Zoom: imagekit.Float(0), + }}, + TransformationPosition: shared.TransformationPositionPath, + }, + DeviceBreakpoints: []float64{640, 750, 828, 1080, 1200, 1920, 2048, 3840}, + ImageBreakpoints: []float64{16, 32, 48, 64, 96, 128, 256, 384}, + Sizes: imagekit.String("(min-width: 768px) 50vw, 100vw"), + Width: imagekit.Float(400), + }, ImageOverlay: shared.ImageOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -113,10 +349,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Blur: imagekit.Float(10), Border: imagekit.String("5_FF0000"), ColorProfile: imagekit.Bool(true), + ColorReplace: imagekit.String("colorReplace"), ContrastStretch: true, Crop: shared.TransformationCropForce, CropMode: shared.TransformationCropModePadResize, DefaultImage: imagekit.String("defaultImage"), + Distort: imagekit.String("distort"), Dpr: imagekit.Float(2), Duration: shared.TransformationDurationUnionParam{ OfFloat: imagekit.Float(0), @@ -142,6 +380,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Overlay: shared.OverlayUnionParam{ OfText: &shared.TextOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -244,6 +483,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Overlay: shared.OverlayUnionParam{ OfText: &shared.TextOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -316,8 +556,32 @@ func TestDummyNewWithOptionalParams(t *testing.T) { OfFloat: imagekit.Float(0), }, }, + ResponsiveImageAttributes: shared.ResponsiveImageAttributesParam{ + Src: "https://ik.imagekit.io/demo/image.jpg?tr=w-3840", + Sizes: imagekit.String("100vw"), + SrcSet: imagekit.String("https://ik.imagekit.io/demo/image.jpg?tr=w-640 640w, https://ik.imagekit.io/demo/image.jpg?tr=w-1080 1080w, https://ik.imagekit.io/demo/image.jpg?tr=w-1920 1920w"), + Width: imagekit.Float(400), + }, + SavedExtensions: shared.SavedExtensionParam{ + ID: imagekit.String("ext_abc123"), + Config: shared.ExtensionConfigUnionParam{ + OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{ + Options: shared.ExtensionConfigRemoveBgOptionsParam{ + AddShadow: imagekit.Bool(true), + BgColor: imagekit.String("bg_color"), + BgImageURL: imagekit.String("bg_image_url"), + Semitransparency: imagekit.Bool(true), + }, + }, + }, + CreatedAt: imagekit.Time(time.Now()), + Description: imagekit.String("Analyzes vehicle images for type, condition, and quality assessment"), + Name: imagekit.String("Car Quality Analysis"), + UpdatedAt: imagekit.Time(time.Now()), + }, SolidColorOverlay: shared.SolidColorOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -400,10 +664,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Blur: imagekit.Float(10), Border: imagekit.String("5_FF0000"), ColorProfile: imagekit.Bool(true), + ColorReplace: imagekit.String("colorReplace"), ContrastStretch: true, Crop: shared.TransformationCropForce, CropMode: shared.TransformationCropModePadResize, DefaultImage: imagekit.String("defaultImage"), + Distort: imagekit.String("distort"), Dpr: imagekit.Float(2), Duration: shared.TransformationDurationUnionParam{ OfFloat: imagekit.Float(0), @@ -429,6 +695,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Overlay: shared.OverlayUnionParam{ OfText: &shared.TextOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -532,6 +799,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { StreamingResolution: shared.StreamingResolution240, SubtitleOverlay: shared.SubtitleOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -576,6 +844,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { }, TextOverlay: shared.TextOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -673,10 +942,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Blur: imagekit.Float(10), Border: imagekit.String("5_FF0000"), ColorProfile: imagekit.Bool(true), + ColorReplace: imagekit.String("colorReplace"), ContrastStretch: true, Crop: shared.TransformationCropForce, CropMode: shared.TransformationCropModePadResize, DefaultImage: imagekit.String("defaultImage"), + Distort: imagekit.String("distort"), Dpr: imagekit.Float(2), Duration: shared.TransformationDurationUnionParam{ OfFloat: imagekit.Float(0), @@ -702,6 +973,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Overlay: shared.OverlayUnionParam{ OfText: &shared.TextOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -803,6 +1075,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { TransformationPosition: shared.TransformationPositionPath, VideoOverlay: shared.VideoOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ @@ -845,10 +1118,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Blur: imagekit.Float(10), Border: imagekit.String("5_FF0000"), ColorProfile: imagekit.Bool(true), + ColorReplace: imagekit.String("colorReplace"), ContrastStretch: true, Crop: shared.TransformationCropForce, CropMode: shared.TransformationCropModePadResize, DefaultImage: imagekit.String("defaultImage"), + Distort: imagekit.String("distort"), Dpr: imagekit.Float(2), Duration: shared.TransformationDurationUnionParam{ OfFloat: imagekit.Float(0), @@ -874,6 +1149,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) { Overlay: shared.OverlayUnionParam{ OfText: &shared.TextOverlayParam{ BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, Position: shared.OverlayPositionParam{ Focus: shared.OverlayPositionFocusCenter, X: shared.OverlayPositionXUnionParam{ diff --git a/file.go b/file.go index 95a44c3..afa48a9 100644 --- a/file.go +++ b/file.go @@ -72,7 +72,7 @@ func (r *FileService) Update(ctx context.Context, fileID string, body FileUpdate // the cache using purge cache API. func (r *FileService) Delete(ctx context.Context, fileID string, opts ...option.RequestOption) (err error) { opts = slices.Concat(r.Options, opts) - opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...) + opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...) if fileID == "" { err = errors.New("missing required fileId parameter") return @@ -1035,6 +1035,8 @@ type FileUpdateResponseExtensionStatus struct { // Any of "success", "pending", "failed". AIAutoDescription string `json:"ai-auto-description"` // Any of "success", "pending", "failed". + AITasks string `json:"ai-tasks"` + // Any of "success", "pending", "failed". AwsAutoTagging string `json:"aws-auto-tagging"` // Any of "success", "pending", "failed". GoogleAutoTagging string `json:"google-auto-tagging"` @@ -1043,6 +1045,7 @@ type FileUpdateResponseExtensionStatus struct { // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. JSON struct { AIAutoDescription respjson.Field + AITasks respjson.Field AwsAutoTagging respjson.Field GoogleAutoTagging respjson.Field RemoveBg respjson.Field @@ -1264,6 +1267,8 @@ type FileUploadResponseExtensionStatus struct { // Any of "success", "pending", "failed". AIAutoDescription string `json:"ai-auto-description"` // Any of "success", "pending", "failed". + AITasks string `json:"ai-tasks"` + // Any of "success", "pending", "failed". AwsAutoTagging string `json:"aws-auto-tagging"` // Any of "success", "pending", "failed". GoogleAutoTagging string `json:"google-auto-tagging"` @@ -1272,6 +1277,7 @@ type FileUploadResponseExtensionStatus struct { // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. JSON struct { AIAutoDescription respjson.Field + AITasks respjson.Field AwsAutoTagging respjson.Field GoogleAutoTagging respjson.Field RemoveBg respjson.Field diff --git a/file_test.go b/file_test.go index 9a8f3a3..d0dacc4 100644 --- a/file_test.go +++ b/file_test.go @@ -65,6 +65,21 @@ func TestFileUpdateWithOptionalParams(t *testing.T) { }, }, shared.ExtensionUnionParam{ OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{}, + }, shared.ExtensionUnionParam{ + OfAITasks: &shared.ExtensionAITasksParam{ + Tasks: []shared.ExtensionAITasksTaskUnionParam{{ + OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{ + Instruction: "What types of clothing items are visible?", + Vocabulary: []string{"shirt", "dress", "jacket"}, + MaxSelections: imagekit.Int(1), + MinSelections: imagekit.Int(0), + }, + }}, + }, + }, shared.ExtensionUnionParam{ + OfSavedExtension: &shared.ExtensionSavedExtensionParam{ + ID: "ext_abc123", + }, }}, RemoveAITags: imagekit.UpdateFileRequestUpdateFileDetailsRemoveAITagsUnionParam{ OfStringArray: []string{"car", "vehicle", "motorsports"}, @@ -258,6 +273,64 @@ func TestFileUploadWithOptionalParams(t *testing.T) { }, }, shared.ExtensionUnionParam{ OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{}, + }, shared.ExtensionUnionParam{ + OfAITasks: &shared.ExtensionAITasksParam{ + Tasks: []shared.ExtensionAITasksTaskUnionParam{{ + OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{ + Instruction: "What types of clothing items are visible in this image?", + Vocabulary: []string{"shirt", "tshirt", "dress", "trousers", "jacket"}, + MaxSelections: imagekit.Int(1), + MinSelections: imagekit.Int(0), + }, + }, { + OfYesNo: &shared.ExtensionAITasksTaskYesNoParam{ + Instruction: "Is this a luxury or high-end fashion item?", + OnNo: shared.ExtensionAITasksTaskYesNoOnNoParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + OnUnknown: shared.ExtensionAITasksTaskYesNoOnUnknownParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + OnYes: shared.ExtensionAITasksTaskYesNoOnYesParam{ + AddTags: []string{"luxury", "premium"}, + RemoveTags: []string{"budget", "affordable"}, + SetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam{{ + Field: "price_range", + Value: shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam{ + OfString: imagekit.String("premium"), + }, + }}, + UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam{{ + Field: "price_range", + }}, + }, + }, + }}, + }, + }, shared.ExtensionUnionParam{ + OfSavedExtension: &shared.ExtensionSavedExtensionParam{ + ID: "ext_abc123", + }, }}, Folder: imagekit.String("folder"), IsPrivateFile: imagekit.Bool(true), diff --git a/filemetadata.go b/filemetadata.go index d2136d7..07f7b05 100644 --- a/filemetadata.go +++ b/filemetadata.go @@ -54,7 +54,7 @@ func (r *FileMetadataService) Get(ctx context.Context, fileID string, opts ...op // using this API. func (r *FileMetadataService) GetFromURL(ctx context.Context, query FileMetadataGetFromURLParams, opts ...option.RequestOption) (res *Metadata, err error) { opts = slices.Concat(r.Options, opts) - path := "v1/files/metadata" + path := "v1/metadata" err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, query, &res, opts...) return } diff --git a/go.mod b/go.mod index 11f9670..f306eb5 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/imagekit-developer/imagekit-go/v2 go 1.22 require ( - github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20250711233419-a173a6c0125c - github.com/tidwall/gjson v1.14.4 + github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20260114220421-3f69fd681bb0 + github.com/tidwall/gjson v1.18.0 github.com/tidwall/sjson v1.2.5 ) diff --git a/go.sum b/go.sum index 318dc77..b09e3fe 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,8 @@ -github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20250711233419-a173a6c0125c h1:Mm99t6GdFMtZOwyyvu3q8gXeZX0sqnjvimTC9QCJwQc= -github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20250711233419-a173a6c0125c/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= +github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20260114220421-3f69fd681bb0 h1:EZXYkItlI9VXF+3x/VFkP8JKa6ibJVZAMjHGfdjzHC8= +github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20260114220421-3f69fd681bb0/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM= -github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= diff --git a/internal/apiform/encoder.go b/internal/apiform/encoder.go index 1d6afb2..58f5621 100644 --- a/internal/apiform/encoder.go +++ b/internal/apiform/encoder.go @@ -60,6 +60,7 @@ type encoderField struct { type encoderEntry struct { reflect.Type dateFormat string + arrayFmt string root bool } @@ -77,6 +78,7 @@ func (e *encoder) typeEncoder(t reflect.Type) encoderFunc { entry := encoderEntry{ Type: t, dateFormat: e.dateFormat, + arrayFmt: e.arrayFmt, root: e.root, } @@ -178,34 +180,9 @@ func (e *encoder) newPrimitiveTypeEncoder(t reflect.Type) encoderFunc { } } -func arrayKeyEncoder(arrayFmt string) func(string, int) string { - var keyFn func(string, int) string - switch arrayFmt { - case "comma", "repeat": - keyFn = func(k string, _ int) string { return k } - case "brackets": - keyFn = func(key string, _ int) string { return key + "[]" } - case "indices:dots": - keyFn = func(k string, i int) string { - if k == "" { - return strconv.Itoa(i) - } - return k + "." + strconv.Itoa(i) - } - case "indices:brackets": - keyFn = func(k string, i int) string { - if k == "" { - return strconv.Itoa(i) - } - return k + "[" + strconv.Itoa(i) + "]" - } - } - return keyFn -} - func (e *encoder) newArrayTypeEncoder(t reflect.Type) encoderFunc { itemEncoder := e.typeEncoder(t.Elem()) - keyFn := arrayKeyEncoder(e.arrayFmt) + keyFn := e.arrayKeyEncoder() return func(key string, v reflect.Value, writer *multipart.Writer) error { if keyFn == nil { return fmt.Errorf("apiform: unsupported array format") @@ -303,13 +280,10 @@ func (e *encoder) newStructTypeEncoder(t reflect.Type) encoderFunc { }) return func(key string, value reflect.Value, writer *multipart.Writer) error { - if key != "" { - key = key + "." - } - + keyFn := e.objKeyEncoder(key) for _, ef := range encoderFields { field := value.FieldByIndex(ef.idx) - err := ef.fn(key+ef.tag.name, field, writer) + err := ef.fn(keyFn(ef.tag.name), field, writer) if err != nil { return err } @@ -405,6 +379,43 @@ func (e *encoder) newReaderTypeEncoder() encoderFunc { } } +func (e encoder) arrayKeyEncoder() func(string, int) string { + var keyFn func(string, int) string + switch e.arrayFmt { + case "comma", "repeat": + keyFn = func(k string, _ int) string { return k } + case "brackets": + keyFn = func(key string, _ int) string { return key + "[]" } + case "indices:dots": + keyFn = func(k string, i int) string { + if k == "" { + return strconv.Itoa(i) + } + return k + "." + strconv.Itoa(i) + } + case "indices:brackets": + keyFn = func(k string, i int) string { + if k == "" { + return strconv.Itoa(i) + } + return k + "[" + strconv.Itoa(i) + "]" + } + } + return keyFn +} + +func (e encoder) objKeyEncoder(parent string) func(string) string { + if parent == "" { + return func(child string) string { return child } + } + switch e.arrayFmt { + case "brackets": + return func(child string) string { return parent + "[" + child + "]" } + default: + return func(child string) string { return parent + "." + child } + } +} + // Given a []byte of json (may either be an empty object or an object that already contains entries) // encode all of the entries in the map to the json byte array. func (e *encoder) encodeMapEntries(key string, v reflect.Value, writer *multipart.Writer) error { @@ -413,10 +424,6 @@ func (e *encoder) encodeMapEntries(key string, v reflect.Value, writer *multipar value reflect.Value } - if key != "" { - key = key + "." - } - pairs := []mapPair{} iter := v.MapRange() @@ -434,8 +441,9 @@ func (e *encoder) encodeMapEntries(key string, v reflect.Value, writer *multipar }) elementEncoder := e.typeEncoder(v.Type().Elem()) + keyFn := e.objKeyEncoder(key) for _, p := range pairs { - err := elementEncoder(key+string(p.key), p.value, writer) + err := elementEncoder(keyFn(p.key), p.value, writer) if err != nil { return err } diff --git a/internal/apiform/form_test.go b/internal/apiform/form_test.go index 3b95794..86cb43d 100644 --- a/internal/apiform/form_test.go +++ b/internal/apiform/form_test.go @@ -123,6 +123,18 @@ type StructUnion struct { param.APIUnion } +type MultipartMarshalerParent struct { + Middle MultipartMarshalerMiddleNext `form:"middle"` +} + +type MultipartMarshalerMiddleNext struct { + MiddleNext MultipartMarshalerMiddle `form:"middleNext"` +} + +type MultipartMarshalerMiddle struct { + Child int `form:"child"` +} + var tests = map[string]struct { buf string val any @@ -366,6 +378,19 @@ true }, }, }, + "recursive_struct,brackets": { + `--xxx +Content-Disposition: form-data; name="child[name]" + +Alex +--xxx +Content-Disposition: form-data; name="name" + +Robert +--xxx-- +`, + Recursive{Name: "Robert", Child: &Recursive{Name: "Alex"}}, + }, "recursive_struct": { `--xxx @@ -529,6 +554,30 @@ Content-Disposition: form-data; name="union" Union: UnionTime(time.Date(2010, 05, 23, 0, 0, 0, 0, time.UTC)), }, }, + "deeply-nested-struct,brackets": { + `--xxx +Content-Disposition: form-data; name="middle[middleNext][child]" + +10 +--xxx-- +`, + MultipartMarshalerParent{ + Middle: MultipartMarshalerMiddleNext{ + MiddleNext: MultipartMarshalerMiddle{ + Child: 10, + }, + }, + }, + }, + "deeply-nested-map,brackets": { + `--xxx +Content-Disposition: form-data; name="middle[middleNext][child]" + +10 +--xxx-- +`, + map[string]any{"middle": map[string]any{"middleNext": map[string]any{"child": 10}}}, + }, } func TestEncode(t *testing.T) { @@ -553,7 +602,7 @@ func TestEncode(t *testing.T) { } raw := buf.Bytes() if string(raw) != strings.ReplaceAll(test.buf, "\n", "\r\n") { - t.Errorf("expected %+#v to serialize to '%s' but got '%s'", test.val, test.buf, string(raw)) + t.Errorf("expected %+#v to serialize to '%s' but got '%s' (with format %s)", test.val, test.buf, string(raw), arrayFmt) } }) } diff --git a/internal/apijson/enum.go b/internal/apijson/enum.go index 18b218a..5bef11c 100644 --- a/internal/apijson/enum.go +++ b/internal/apijson/enum.go @@ -29,7 +29,7 @@ type validatorFunc func(reflect.Value) exactness var validators sync.Map var validationRegistry = map[reflect.Type][]validationEntry{} -func RegisterFieldValidator[T any, V string | bool | int](fieldName string, values ...V) { +func RegisterFieldValidator[T any, V string | bool | int | float64](fieldName string, values ...V) { var t T parentType := reflect.TypeOf(t) diff --git a/internal/version.go b/internal/version.go index fef6622..436f832 100644 --- a/internal/version.go +++ b/internal/version.go @@ -2,4 +2,4 @@ package internal -const PackageVersion = "2.0.0" // x-release-please-version +const PackageVersion = "2.1.0" // x-release-please-version diff --git a/lib/helper.go b/lib/helper.go index 925e1ee..d8e4bf8 100644 --- a/lib/helper.go +++ b/lib/helper.go @@ -254,10 +254,14 @@ func (r *HelperService) buildTransformationStringInternal(transformation []share if !param.IsOmitted(currentTransform.Radius.OfMax) { return "max" } + if value := r.getOptParamValue(currentTransform.Radius.OfString); value != "" { + return value + } return r.getOptParamValue(currentTransform.Radius.OfFloat) }}, {"bg", func() string { return r.getOptParamValue(currentTransform.Background) }}, {"b", func() string { return r.getOptParamValue(currentTransform.Border) }}, + {"cr", func() string { return r.getOptParamValue(currentTransform.ColorReplace) }}, {"di", func() string { if !param.IsOmitted(currentTransform.DefaultImage) && currentTransform.DefaultImage.Value != "" { value := currentTransform.DefaultImage.Value @@ -399,6 +403,12 @@ func (r *HelperService) buildTransformationStringInternal(transformation []share } return "", false }}, + {"e-distort", func() (string, bool) { + if value := r.getOptParamValue(currentTransform.Distort); value != "" { + return value, false + } + return "", false + }}, } for _, effect := range effectMappings { @@ -589,6 +599,11 @@ func (r *HelperService) processOverlay(overlay shared.OverlayUnionParam) string // Process position and timing if baseOverlay is set if baseOverlay != nil { + // LayerMode + if baseOverlay.LayerMode != "" { + entries = append(entries, fmt.Sprintf("lm-%s", baseOverlay.LayerMode)) + } + // Position position := baseOverlay.Position if !param.IsOmitted(position.X.OfFloat) { diff --git a/packages/respjson/respjson.go b/packages/respjson/respjson.go index cc0088c..9e61c5c 100644 --- a/packages/respjson/respjson.go +++ b/packages/respjson/respjson.go @@ -5,7 +5,7 @@ package respjson // Use [Field.Valid] to check if an optional value was null or omitted. // // A Field will always occur in the following structure, where it -// mirrors the original field in it's parent struct: +// mirrors the original field in its parent struct: // // type ExampleObject struct { // Foo bool `json:"foo"` diff --git a/savedextension.go b/savedextension.go new file mode 100644 index 0000000..1999c24 --- /dev/null +++ b/savedextension.go @@ -0,0 +1,135 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +package imagekit + +import ( + "context" + "errors" + "fmt" + "net/http" + "slices" + + "github.com/imagekit-developer/imagekit-go/v2/internal/apijson" + "github.com/imagekit-developer/imagekit-go/v2/internal/requestconfig" + "github.com/imagekit-developer/imagekit-go/v2/option" + "github.com/imagekit-developer/imagekit-go/v2/packages/param" + "github.com/imagekit-developer/imagekit-go/v2/shared" +) + +// SavedExtensionService contains methods and other services that help with +// interacting with the ImageKit API. +// +// Note, unlike clients, this service does not read variables from the environment +// automatically. You should not instantiate this service directly, and instead use +// the [NewSavedExtensionService] method instead. +type SavedExtensionService struct { + Options []option.RequestOption +} + +// NewSavedExtensionService generates a new service that applies the given options +// to each request. These options are applied after the parent client's options (if +// there is one), and before any request-specific options. +func NewSavedExtensionService(opts ...option.RequestOption) (r SavedExtensionService) { + r = SavedExtensionService{} + r.Options = opts + return +} + +// This API creates a new saved extension. Saved extensions allow you to save +// complex extension configurations (like AI tasks) and reuse them by referencing +// the ID in upload or update file APIs. +// +// **Saved extension limit** \ +// You can create a maximum of 100 saved extensions per account. +func (r *SavedExtensionService) New(ctx context.Context, body SavedExtensionNewParams, opts ...option.RequestOption) (res *shared.SavedExtension, err error) { + opts = slices.Concat(r.Options, opts) + path := "v1/saved-extensions" + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...) + return +} + +// This API updates an existing saved extension. You can update the name, +// description, or config. +func (r *SavedExtensionService) Update(ctx context.Context, id string, body SavedExtensionUpdateParams, opts ...option.RequestOption) (res *shared.SavedExtension, err error) { + opts = slices.Concat(r.Options, opts) + if id == "" { + err = errors.New("missing required id parameter") + return + } + path := fmt.Sprintf("v1/saved-extensions/%s", id) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodPatch, path, body, &res, opts...) + return +} + +// This API returns an array of all saved extensions for your account. Saved +// extensions allow you to save complex extension configurations and reuse them by +// referencing them by ID in upload or update file APIs. +func (r *SavedExtensionService) List(ctx context.Context, opts ...option.RequestOption) (res *[]shared.SavedExtension, err error) { + opts = slices.Concat(r.Options, opts) + path := "v1/saved-extensions" + err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...) + return +} + +// This API deletes a saved extension permanently. +func (r *SavedExtensionService) Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error) { + opts = slices.Concat(r.Options, opts) + opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...) + if id == "" { + err = errors.New("missing required id parameter") + return + } + path := fmt.Sprintf("v1/saved-extensions/%s", id) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodDelete, path, nil, nil, opts...) + return +} + +// This API returns details of a specific saved extension by ID. +func (r *SavedExtensionService) Get(ctx context.Context, id string, opts ...option.RequestOption) (res *shared.SavedExtension, err error) { + opts = slices.Concat(r.Options, opts) + if id == "" { + err = errors.New("missing required id parameter") + return + } + path := fmt.Sprintf("v1/saved-extensions/%s", id) + err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...) + return +} + +type SavedExtensionNewParams struct { + // Configuration object for an extension (base extensions only, not saved extension + // references). + Config shared.ExtensionConfigUnionParam `json:"config,omitzero,required"` + // Description of what the saved extension does. + Description string `json:"description,required"` + // Name of the saved extension. + Name string `json:"name,required"` + paramObj +} + +func (r SavedExtensionNewParams) MarshalJSON() (data []byte, err error) { + type shadow SavedExtensionNewParams + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SavedExtensionNewParams) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type SavedExtensionUpdateParams struct { + // Updated description of the saved extension. + Description param.Opt[string] `json:"description,omitzero"` + // Updated name of the saved extension. + Name param.Opt[string] `json:"name,omitzero"` + // Configuration object for an extension (base extensions only, not saved extension + // references). + Config shared.ExtensionConfigUnionParam `json:"config,omitzero"` + paramObj +} + +func (r SavedExtensionUpdateParams) MarshalJSON() (data []byte, err error) { + type shadow SavedExtensionUpdateParams + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SavedExtensionUpdateParams) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} diff --git a/savedextension_test.go b/savedextension_test.go new file mode 100644 index 0000000..effbeaf --- /dev/null +++ b/savedextension_test.go @@ -0,0 +1,165 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +package imagekit_test + +import ( + "context" + "errors" + "os" + "testing" + + "github.com/imagekit-developer/imagekit-go/v2" + "github.com/imagekit-developer/imagekit-go/v2/internal/testutil" + "github.com/imagekit-developer/imagekit-go/v2/option" + "github.com/imagekit-developer/imagekit-go/v2/shared" +) + +func TestSavedExtensionNewWithOptionalParams(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := imagekit.NewClient( + option.WithBaseURL(baseURL), + option.WithPrivateKey("My Private Key"), + option.WithPassword("My Password"), + ) + _, err := client.SavedExtensions.New(context.TODO(), imagekit.SavedExtensionNewParams{ + Config: shared.ExtensionConfigUnionParam{ + OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{ + Options: shared.ExtensionConfigRemoveBgOptionsParam{ + AddShadow: imagekit.Bool(true), + BgColor: imagekit.String("bg_color"), + BgImageURL: imagekit.String("bg_image_url"), + Semitransparency: imagekit.Bool(true), + }, + }, + }, + Description: "Analyzes vehicle images for type, condition, and quality assessment", + Name: "Car Quality Analysis", + }) + if err != nil { + var apierr *imagekit.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + +func TestSavedExtensionUpdateWithOptionalParams(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := imagekit.NewClient( + option.WithBaseURL(baseURL), + option.WithPrivateKey("My Private Key"), + option.WithPassword("My Password"), + ) + _, err := client.SavedExtensions.Update( + context.TODO(), + "id", + imagekit.SavedExtensionUpdateParams{ + Config: shared.ExtensionConfigUnionParam{ + OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{ + Options: shared.ExtensionConfigRemoveBgOptionsParam{ + AddShadow: imagekit.Bool(true), + BgColor: imagekit.String("bg_color"), + BgImageURL: imagekit.String("bg_image_url"), + Semitransparency: imagekit.Bool(true), + }, + }, + }, + Description: imagekit.String("x"), + Name: imagekit.String("x"), + }, + ) + if err != nil { + var apierr *imagekit.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + +func TestSavedExtensionList(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := imagekit.NewClient( + option.WithBaseURL(baseURL), + option.WithPrivateKey("My Private Key"), + option.WithPassword("My Password"), + ) + _, err := client.SavedExtensions.List(context.TODO()) + if err != nil { + var apierr *imagekit.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + +func TestSavedExtensionDelete(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := imagekit.NewClient( + option.WithBaseURL(baseURL), + option.WithPrivateKey("My Private Key"), + option.WithPassword("My Password"), + ) + err := client.SavedExtensions.Delete(context.TODO(), "id") + if err != nil { + var apierr *imagekit.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} + +func TestSavedExtensionGet(t *testing.T) { + t.Skip("Prism tests are disabled") + baseURL := "http://localhost:4010" + if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok { + baseURL = envURL + } + if !testutil.CheckTestServer(t, baseURL) { + return + } + client := imagekit.NewClient( + option.WithBaseURL(baseURL), + option.WithPrivateKey("My Private Key"), + option.WithPassword("My Password"), + ) + _, err := client.SavedExtensions.Get(context.TODO(), "id") + if err != nil { + var apierr *imagekit.Error + if errors.As(err, &apierr) { + t.Log(string(apierr.DumpRequest(true))) + } + t.Fatalf("err should be nil: %s", err.Error()) + } +} diff --git a/shared/constant/constants.go b/shared/constant/constants.go index 2496e90..bc4ea8e 100644 --- a/shared/constant/constants.go +++ b/shared/constant/constants.go @@ -20,6 +20,7 @@ func ValueOf[T Constant[T]]() T { type Abs string // Always "abs" type AIAutoDescription string // Always "ai-auto-description" +type AITasks string // Always "ai-tasks" type Akamai string // Always "AKAMAI" type AkeneoPim string // Always "AKENEO_PIM" type All string // Always "all" @@ -34,6 +35,9 @@ type Max string // Always "max" type RemoveBg string // Always "remove-bg" type S3 string // Always "S3" type S3Compatible string // Always "S3_COMPATIBLE" +type SavedExtension string // Always "saved-extension" +type SelectMetadata string // Always "select_metadata" +type SelectTags string // Always "select_tags" type SolidColor string // Always "solidColor" type Subtitle string // Always "subtitle" type Text string // Always "text" @@ -49,9 +53,11 @@ type VideoTransformationError string // Always "video.transformation.error" type VideoTransformationReady string // Always "video.transformation.ready" type WebFolder string // Always "WEB_FOLDER" type WebProxy string // Always "WEB_PROXY" +type YesNo string // Always "yes_no" func (c Abs) Default() Abs { return "abs" } func (c AIAutoDescription) Default() AIAutoDescription { return "ai-auto-description" } +func (c AITasks) Default() AITasks { return "ai-tasks" } func (c Akamai) Default() Akamai { return "AKAMAI" } func (c AkeneoPim) Default() AkeneoPim { return "AKENEO_PIM" } func (c All) Default() All { return "all" } @@ -66,6 +72,9 @@ func (c Max) Default() Max { return "max" } func (c RemoveBg) Default() RemoveBg { return "remove-bg" } func (c S3) Default() S3 { return "S3" } func (c S3Compatible) Default() S3Compatible { return "S3_COMPATIBLE" } +func (c SavedExtension) Default() SavedExtension { return "saved-extension" } +func (c SelectMetadata) Default() SelectMetadata { return "select_metadata" } +func (c SelectTags) Default() SelectTags { return "select_tags" } func (c SolidColor) Default() SolidColor { return "solidColor" } func (c Subtitle) Default() Subtitle { return "subtitle" } func (c Text) Default() Text { return "text" } @@ -95,9 +104,11 @@ func (c VideoTransformationReady) Default() VideoTransformationReady { } func (c WebFolder) Default() WebFolder { return "WEB_FOLDER" } func (c WebProxy) Default() WebProxy { return "WEB_PROXY" } +func (c YesNo) Default() YesNo { return "yes_no" } func (c Abs) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c AIAutoDescription) MarshalJSON() ([]byte, error) { return marshalString(c) } +func (c AITasks) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c Akamai) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c AkeneoPim) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c All) MarshalJSON() ([]byte, error) { return marshalString(c) } @@ -112,6 +123,9 @@ func (c Max) MarshalJSON() ([]byte, error) { return mars func (c RemoveBg) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c S3) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c S3Compatible) MarshalJSON() ([]byte, error) { return marshalString(c) } +func (c SavedExtension) MarshalJSON() ([]byte, error) { return marshalString(c) } +func (c SelectMetadata) MarshalJSON() ([]byte, error) { return marshalString(c) } +func (c SelectTags) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c SolidColor) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c Subtitle) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c Text) MarshalJSON() ([]byte, error) { return marshalString(c) } @@ -127,6 +141,7 @@ func (c VideoTransformationError) MarshalJSON() ([]byte, error) { return mars func (c VideoTransformationReady) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c WebFolder) MarshalJSON() ([]byte, error) { return marshalString(c) } func (c WebProxy) MarshalJSON() ([]byte, error) { return marshalString(c) } +func (c YesNo) MarshalJSON() ([]byte, error) { return marshalString(c) } type constant[T any] interface { Constant[T] diff --git a/shared/shared.go b/shared/shared.go index 831548c..3cf5b4c 100644 --- a/shared/shared.go +++ b/shared/shared.go @@ -3,199 +3,2693 @@ package shared import ( + "encoding/json" + "time" + "github.com/imagekit-developer/imagekit-go/v2/internal/apijson" "github.com/imagekit-developer/imagekit-go/v2/packages/param" + "github.com/imagekit-developer/imagekit-go/v2/packages/respjson" "github.com/imagekit-developer/imagekit-go/v2/shared/constant" ) -// aliased to make [param.APIUnion] private when embedding -type paramUnion = param.APIUnion +// aliased to make [param.APIUnion] private when embedding +type paramUnion = param.APIUnion + +// aliased to make [param.APIObject] private when embedding +type paramObj = param.APIObject + +type BaseOverlayParam struct { + // Controls how the layer blends with the base image or underlying content. Maps to + // `lm` in the URL. By default, layers completely cover the base image beneath + // them. Layer modes change this behavior: + // + // - `multiply`: Multiplies the pixel values of the layer with the base image. The + // result is always darker than the original images. This is ideal for applying + // shadows or color tints. + // - `displace`: Uses the layer as a displacement map to distort pixels in the base + // image. The red channel controls horizontal displacement, and the green channel + // controls vertical displacement. Requires `x` or `y` parameter to control + // displacement magnitude. + // - `cutout`: Acts as an inverse mask where opaque areas of the layer turn the + // base image transparent, while transparent areas leave the base image + // unchanged. This mode functions like a hole-punch, effectively cutting the + // shape of the layer out of the underlying image. + // - `cutter`: Acts as a shape mask where only the parts of the base image that + // fall inside the opaque area of the layer are preserved. This mode functions + // like a cookie-cutter, trimming the base image to match the specific dimensions + // and shape of the layer. See + // [Layer modes](https://imagekit.io/docs/add-overlays-on-images#layer-modes). + // + // Any of "multiply", "cutter", "cutout", "displace". + LayerMode BaseOverlayLayerMode `json:"layerMode,omitzero"` + // Specifies the overlay's position relative to the parent asset. See + // [Position of Layer](https://imagekit.io/docs/transformations#position-of-layer). + Position OverlayPositionParam `json:"position,omitzero"` + // Specifies timing information for the overlay (only applicable if the base asset + // is a video). See + // [Position of Layer](https://imagekit.io/docs/transformations#position-of-layer). + Timing OverlayTimingParam `json:"timing,omitzero"` + paramObj +} + +func (r BaseOverlayParam) MarshalJSON() (data []byte, err error) { + type shadow BaseOverlayParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *BaseOverlayParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Controls how the layer blends with the base image or underlying content. Maps to +// `lm` in the URL. By default, layers completely cover the base image beneath +// them. Layer modes change this behavior: +// +// - `multiply`: Multiplies the pixel values of the layer with the base image. The +// result is always darker than the original images. This is ideal for applying +// shadows or color tints. +// - `displace`: Uses the layer as a displacement map to distort pixels in the base +// image. The red channel controls horizontal displacement, and the green channel +// controls vertical displacement. Requires `x` or `y` parameter to control +// displacement magnitude. +// - `cutout`: Acts as an inverse mask where opaque areas of the layer turn the +// base image transparent, while transparent areas leave the base image +// unchanged. This mode functions like a hole-punch, effectively cutting the +// shape of the layer out of the underlying image. +// - `cutter`: Acts as a shape mask where only the parts of the base image that +// fall inside the opaque area of the layer are preserved. This mode functions +// like a cookie-cutter, trimming the base image to match the specific dimensions +// and shape of the layer. See +// [Layer modes](https://imagekit.io/docs/add-overlays-on-images#layer-modes). +type BaseOverlayLayerMode string + +const ( + BaseOverlayLayerModeMultiply BaseOverlayLayerMode = "multiply" + BaseOverlayLayerModeCutter BaseOverlayLayerMode = "cutter" + BaseOverlayLayerModeCutout BaseOverlayLayerMode = "cutout" + BaseOverlayLayerModeDisplace BaseOverlayLayerMode = "displace" +) + +// ExtensionConfigUnion contains all possible properties and values from +// [ExtensionConfigRemoveBg], [ExtensionConfigAutoTagging], +// [ExtensionConfigAIAutoDescription], [ExtensionConfigAITasks]. +// +// Use the [ExtensionConfigUnion.AsAny] method to switch on the variant. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +type ExtensionConfigUnion struct { + // Any of "remove-bg", nil, "ai-auto-description", "ai-tasks". + Name string `json:"name"` + // This field is from variant [ExtensionConfigRemoveBg]. + Options ExtensionConfigRemoveBgOptions `json:"options"` + // This field is from variant [ExtensionConfigAutoTagging]. + MaxTags int64 `json:"maxTags"` + // This field is from variant [ExtensionConfigAutoTagging]. + MinConfidence int64 `json:"minConfidence"` + // This field is from variant [ExtensionConfigAITasks]. + Tasks []ExtensionConfigAITasksTaskUnion `json:"tasks"` + JSON struct { + Name respjson.Field + Options respjson.Field + MaxTags respjson.Field + MinConfidence respjson.Field + Tasks respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigUnion) AsRemoveBg() (v ExtensionConfigRemoveBg) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigUnion) AsAutoTagging() (v ExtensionConfigAutoTagging) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigUnion) AsAIAutoDescription() (v ExtensionConfigAIAutoDescription) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigUnion) AsAITasks() (v ExtensionConfigAITasks) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigUnion) RawJSON() string { return u.JSON.raw } + +func (r *ExtensionConfigUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ToParam converts this ExtensionConfigUnion to a ExtensionConfigUnionParam. +// +// Warning: the fields of the param type will not be present. ToParam should only +// be used at the last possible moment before sending a request. Test for this with +// ExtensionConfigUnionParam.Overrides() +func (r ExtensionConfigUnion) ToParam() ExtensionConfigUnionParam { + return param.Override[ExtensionConfigUnionParam](json.RawMessage(r.RawJSON())) +} + +type ExtensionConfigRemoveBg struct { + // Specifies the background removal extension. + Name constant.RemoveBg `json:"name,required"` + Options ExtensionConfigRemoveBgOptions `json:"options"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Name respjson.Field + Options respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigRemoveBg) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigRemoveBg) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigRemoveBgOptions struct { + // Whether to add an artificial shadow to the result. Default is false. Note: + // Adding shadows is currently only supported for car photos. + AddShadow bool `json:"add_shadow"` + // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or + // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be + // empty. + BgColor string `json:"bg_color"` + // Sets a background image from a URL. If this parameter is set, `bg_color` must be + // empty. + BgImageURL string `json:"bg_image_url"` + // Allows semi-transparent regions in the result. Default is true. Note: + // Semitransparency is currently only supported for car windows. + Semitransparency bool `json:"semitransparency"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + AddShadow respjson.Field + BgColor respjson.Field + BgImageURL respjson.Field + Semitransparency respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigRemoveBgOptions) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigRemoveBgOptions) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAutoTagging struct { + // Maximum number of tags to attach to the asset. + MaxTags int64 `json:"maxTags,required"` + // Minimum confidence level for tags to be considered valid. + MinConfidence int64 `json:"minConfidence,required"` + // Specifies the auto-tagging extension used. + // + // Any of "google-auto-tagging", "aws-auto-tagging". + Name string `json:"name,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + MaxTags respjson.Field + MinConfidence respjson.Field + Name respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAutoTagging) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAutoTagging) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAIAutoDescription struct { + // Specifies the auto description extension. + Name constant.AIAutoDescription `json:"name,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Name respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAIAutoDescription) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAIAutoDescription) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasks struct { + // Specifies the AI tasks extension for automated image analysis using AI models. + Name constant.AITasks `json:"name,required"` + // Array of task objects defining AI operations to perform on the asset. + Tasks []ExtensionConfigAITasksTaskUnion `json:"tasks,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Name respjson.Field + Tasks respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasks) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasks) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskUnion contains all possible properties and values from +// [ExtensionConfigAITasksTaskSelectTags], +// [ExtensionConfigAITasksTaskSelectMetadata], [ExtensionConfigAITasksTaskYesNo]. +// +// Use the [ExtensionConfigAITasksTaskUnion.AsAny] method to switch on the variant. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +type ExtensionConfigAITasksTaskUnion struct { + Instruction string `json:"instruction"` + // Any of "select_tags", "select_metadata", "yes_no". + Type string `json:"type"` + // This field is a union of [[]string], + // [[]ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion] + Vocabulary ExtensionConfigAITasksTaskUnionVocabulary `json:"vocabulary"` + MaxSelections int64 `json:"max_selections"` + MinSelections int64 `json:"min_selections"` + // This field is from variant [ExtensionConfigAITasksTaskSelectMetadata]. + Field string `json:"field"` + // This field is from variant [ExtensionConfigAITasksTaskYesNo]. + OnNo ExtensionConfigAITasksTaskYesNoOnNo `json:"on_no"` + // This field is from variant [ExtensionConfigAITasksTaskYesNo]. + OnUnknown ExtensionConfigAITasksTaskYesNoOnUnknown `json:"on_unknown"` + // This field is from variant [ExtensionConfigAITasksTaskYesNo]. + OnYes ExtensionConfigAITasksTaskYesNoOnYes `json:"on_yes"` + JSON struct { + Instruction respjson.Field + Type respjson.Field + Vocabulary respjson.Field + MaxSelections respjson.Field + MinSelections respjson.Field + Field respjson.Field + OnNo respjson.Field + OnUnknown respjson.Field + OnYes respjson.Field + raw string + } `json:"-"` +} + +// anyExtensionConfigAITasksTask is implemented by each variant of +// [ExtensionConfigAITasksTaskUnion] to add type safety for the return type of +// [ExtensionConfigAITasksTaskUnion.AsAny] +type anyExtensionConfigAITasksTask interface { + implExtensionConfigAITasksTaskUnion() +} + +// Use the following switch statement to find the correct variant +// +// switch variant := ExtensionConfigAITasksTaskUnion.AsAny().(type) { +// case shared.ExtensionConfigAITasksTaskSelectTags: +// case shared.ExtensionConfigAITasksTaskSelectMetadata: +// case shared.ExtensionConfigAITasksTaskYesNo: +// default: +// fmt.Errorf("no variant present") +// } +func (u ExtensionConfigAITasksTaskUnion) AsAny() anyExtensionConfigAITasksTask { + switch u.Type { + case "select_tags": + return u.AsSelectTags() + case "select_metadata": + return u.AsSelectMetadata() + case "yes_no": + return u.AsYesNo() + } + return nil +} + +func (u ExtensionConfigAITasksTaskUnion) AsSelectTags() (v ExtensionConfigAITasksTaskSelectTags) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskUnion) AsSelectMetadata() (v ExtensionConfigAITasksTaskSelectMetadata) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskUnion) AsYesNo() (v ExtensionConfigAITasksTaskYesNo) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskUnion) RawJSON() string { return u.JSON.raw } + +func (r *ExtensionConfigAITasksTaskUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskUnionVocabulary is an implicit subunion of +// [ExtensionConfigAITasksTaskUnion]. ExtensionConfigAITasksTaskUnionVocabulary +// provides convenient access to the sub-properties of the union. +// +// For type safety it is recommended to directly use a variant of the +// [ExtensionConfigAITasksTaskUnion]. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfStringArray +// OfExtensionConfigAITasksTaskSelectMetadataVocabularyArray] +type ExtensionConfigAITasksTaskUnionVocabulary struct { + // This field will be present if the value is a [[]string] instead of an object. + OfStringArray []string `json:",inline"` + // This field will be present if the value is a + // [[]ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion] instead of an + // object. + OfExtensionConfigAITasksTaskSelectMetadataVocabularyArray []ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion `json:",inline"` + JSON struct { + OfStringArray respjson.Field + OfExtensionConfigAITasksTaskSelectMetadataVocabularyArray respjson.Field + raw string + } `json:"-"` +} + +func (r *ExtensionConfigAITasksTaskUnionVocabulary) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskSelectTags struct { + // The question or instruction for the AI to analyze the image. + Instruction string `json:"instruction,required"` + // Task type that analyzes the image and adds matching tags from a vocabulary. + Type constant.SelectTags `json:"type,required"` + // Array of possible tag values. Combined length of all strings must not exceed 500 + // characters. Cannot contain the `%` character. + Vocabulary []string `json:"vocabulary,required"` + // Maximum number of tags to select from the vocabulary. + MaxSelections int64 `json:"max_selections"` + // Minimum number of tags to select from the vocabulary. + MinSelections int64 `json:"min_selections"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Instruction respjson.Field + Type respjson.Field + Vocabulary respjson.Field + MaxSelections respjson.Field + MinSelections respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskSelectTags) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskSelectTags) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func (ExtensionConfigAITasksTaskSelectTags) implExtensionConfigAITasksTaskUnion() {} + +type ExtensionConfigAITasksTaskSelectMetadata struct { + // Name of the custom metadata field to set. The field must exist in your account. + Field string `json:"field,required"` + // The question or instruction for the AI to analyze the image. + Instruction string `json:"instruction,required"` + // Task type that analyzes the image and sets a custom metadata field value from a + // vocabulary. + Type constant.SelectMetadata `json:"type,required"` + // Maximum number of values to select from the vocabulary. + MaxSelections int64 `json:"max_selections"` + // Minimum number of values to select from the vocabulary. + MinSelections int64 `json:"min_selections"` + // Array of possible values matching the custom metadata field type. + Vocabulary []ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion `json:"vocabulary"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + Instruction respjson.Field + Type respjson.Field + MaxSelections respjson.Field + MinSelections respjson.Field + Vocabulary respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskSelectMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskSelectMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func (ExtensionConfigAITasksTaskSelectMetadata) implExtensionConfigAITasksTaskUnion() {} + +// ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion contains all possible +// properties and values from [string], [float64], [bool]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool] +type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) RawJSON() string { return u.JSON.raw } + +func (r *ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNo struct { + // The yes/no question for the AI to answer about the image. + Instruction string `json:"instruction,required"` + // Task type that asks a yes/no question and executes actions based on the answer. + Type constant.YesNo `json:"type,required"` + // Actions to execute if the AI answers no. + OnNo ExtensionConfigAITasksTaskYesNoOnNo `json:"on_no"` + // Actions to execute if the AI cannot determine the answer. + OnUnknown ExtensionConfigAITasksTaskYesNoOnUnknown `json:"on_unknown"` + // Actions to execute if the AI answers yes. + OnYes ExtensionConfigAITasksTaskYesNoOnYes `json:"on_yes"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Instruction respjson.Field + Type respjson.Field + OnNo respjson.Field + OnUnknown respjson.Field + OnYes respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNo) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNo) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func (ExtensionConfigAITasksTaskYesNo) implExtensionConfigAITasksTaskUnion() {} + +// Actions to execute if the AI answers no. +type ExtensionConfigAITasksTaskYesNoOnNo struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags"` + // Array of custom metadata field updates. + SetMetadata []ExtensionConfigAITasksTaskYesNoOnNoSetMetadata `json:"set_metadata"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata `json:"unset_metadata"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + AddTags respjson.Field + RemoveTags respjson.Field + SetMetadata respjson.Field + UnsetMetadata respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnNo) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnNo) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadata struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion `json:"value,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + Value respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnNoSetMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion contains all possible +// properties and values from [string], [float64], [bool], +// [[]ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool OfMixed] +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + // This field will be present if the value is a + // [[]ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion] instead of + // an object. + OfMixed []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + OfMixed respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsMixed() (v []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) RawJSON() string { return u.JSON.raw } + +func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion contains all +// possible properties and values from [string], [float64], [bool]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool] +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) RawJSON() string { + return u.JSON.raw +} + +func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Actions to execute if the AI cannot determine the answer. +type ExtensionConfigAITasksTaskYesNoOnUnknown struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags"` + // Array of custom metadata field updates. + SetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata `json:"set_metadata"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata `json:"unset_metadata"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + AddTags respjson.Field + RemoveTags respjson.Field + SetMetadata respjson.Field + UnsetMetadata respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnUnknown) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnUnknown) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion `json:"value,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + Value respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion contains all +// possible properties and values from [string], [float64], [bool], +// [[]ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool OfMixed] +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + // This field will be present if the value is a + // [[]ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion] + // instead of an object. + OfMixed []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + OfMixed respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsMixed() (v []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) RawJSON() string { + return u.JSON.raw +} + +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion contains +// all possible properties and values from [string], [float64], [bool]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool] +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) RawJSON() string { + return u.JSON.raw +} + +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Actions to execute if the AI answers yes. +type ExtensionConfigAITasksTaskYesNoOnYes struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags"` + // Array of custom metadata field updates. + SetMetadata []ExtensionConfigAITasksTaskYesNoOnYesSetMetadata `json:"set_metadata"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata `json:"unset_metadata"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + AddTags respjson.Field + RemoveTags respjson.Field + SetMetadata respjson.Field + UnsetMetadata respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnYes) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnYes) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadata struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion `json:"value,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + Value respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnYesSetMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion contains all possible +// properties and values from [string], [float64], [bool], +// [[]ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool OfMixed] +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + // This field will be present if the value is a + // [[]ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion] instead + // of an object. + OfMixed []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + OfMixed respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsMixed() (v []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) RawJSON() string { + return u.JSON.raw +} + +func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion contains all +// possible properties and values from [string], [float64], [bool]. +// +// Use the methods beginning with 'As' to cast the union to one of its variants. +// +// If the underlying value is not a json object, one of the following properties +// will be valid: OfString OfFloat OfBool] +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion struct { + // This field will be present if the value is a [string] instead of an object. + OfString string `json:",inline"` + // This field will be present if the value is a [float64] instead of an object. + OfFloat float64 `json:",inline"` + // This field will be present if the value is a [bool] instead of an object. + OfBool bool `json:",inline"` + JSON struct { + OfString respjson.Field + OfFloat respjson.Field + OfBool respjson.Field + raw string + } `json:"-"` +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) AsString() (v string) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) AsFloat() (v float64) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) AsBool() (v bool) { + apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v) + return +} + +// Returns the unmodified JSON received from the API +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) RawJSON() string { + return u.JSON.raw +} + +func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + Field respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata) RawJSON() string { return r.JSON.raw } +func (r *ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func ExtensionConfigParamOfAutoTagging(maxTags int64, minConfidence int64, name string) ExtensionConfigUnionParam { + var variant ExtensionConfigAutoTaggingParam + variant.MaxTags = maxTags + variant.MinConfidence = minConfidence + variant.Name = name + return ExtensionConfigUnionParam{OfAutoTagging: &variant} +} + +func ExtensionConfigParamOfAITasks(tasks []ExtensionConfigAITasksTaskUnionParam) ExtensionConfigUnionParam { + var aiTasks ExtensionConfigAITasksParam + aiTasks.Tasks = tasks + return ExtensionConfigUnionParam{OfAITasks: &aiTasks} +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigUnionParam struct { + OfRemoveBg *ExtensionConfigRemoveBgParam `json:",omitzero,inline"` + OfAutoTagging *ExtensionConfigAutoTaggingParam `json:",omitzero,inline"` + OfAIAutoDescription *ExtensionConfigAIAutoDescriptionParam `json:",omitzero,inline"` + OfAITasks *ExtensionConfigAITasksParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfRemoveBg, u.OfAutoTagging, u.OfAIAutoDescription, u.OfAITasks) +} +func (u *ExtensionConfigUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigUnionParam) asAny() any { + if !param.IsOmitted(u.OfRemoveBg) { + return u.OfRemoveBg + } else if !param.IsOmitted(u.OfAutoTagging) { + return u.OfAutoTagging + } else if !param.IsOmitted(u.OfAIAutoDescription) { + return u.OfAIAutoDescription + } else if !param.IsOmitted(u.OfAITasks) { + return u.OfAITasks + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigUnionParam) GetOptions() *ExtensionConfigRemoveBgOptionsParam { + if vt := u.OfRemoveBg; vt != nil { + return &vt.Options + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigUnionParam) GetMaxTags() *int64 { + if vt := u.OfAutoTagging; vt != nil { + return &vt.MaxTags + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigUnionParam) GetMinConfidence() *int64 { + if vt := u.OfAutoTagging; vt != nil { + return &vt.MinConfidence + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigUnionParam) GetTasks() []ExtensionConfigAITasksTaskUnionParam { + if vt := u.OfAITasks; vt != nil { + return vt.Tasks + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigUnionParam) GetName() *string { + if vt := u.OfRemoveBg; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfAutoTagging; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfAIAutoDescription; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfAITasks; vt != nil { + return (*string)(&vt.Name) + } + return nil +} + +func init() { + apijson.RegisterUnion[ExtensionConfigUnionParam]( + "name", + apijson.Discriminator[ExtensionConfigRemoveBgParam]("remove-bg"), + apijson.Discriminator[ExtensionConfigAutoTaggingParam]("google-auto-tagging"), + apijson.Discriminator[ExtensionConfigAutoTaggingParam]("aws-auto-tagging"), + apijson.Discriminator[ExtensionConfigAIAutoDescriptionParam]("ai-auto-description"), + apijson.Discriminator[ExtensionConfigAITasksParam]("ai-tasks"), + ) +} + +// The property Name is required. +type ExtensionConfigRemoveBgParam struct { + Options ExtensionConfigRemoveBgOptionsParam `json:"options,omitzero"` + // Specifies the background removal extension. + // + // This field can be elided, and will marshal its zero value as "remove-bg". + Name constant.RemoveBg `json:"name,required"` + paramObj +} + +func (r ExtensionConfigRemoveBgParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigRemoveBgParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigRemoveBgParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionConfigRemoveBgOptionsParam struct { + // Whether to add an artificial shadow to the result. Default is false. Note: + // Adding shadows is currently only supported for car photos. + AddShadow param.Opt[bool] `json:"add_shadow,omitzero"` + // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or + // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be + // empty. + BgColor param.Opt[string] `json:"bg_color,omitzero"` + // Sets a background image from a URL. If this parameter is set, `bg_color` must be + // empty. + BgImageURL param.Opt[string] `json:"bg_image_url,omitzero"` + // Allows semi-transparent regions in the result. Default is true. Note: + // Semitransparency is currently only supported for car windows. + Semitransparency param.Opt[bool] `json:"semitransparency,omitzero"` + paramObj +} + +func (r ExtensionConfigRemoveBgOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigRemoveBgOptionsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigRemoveBgOptionsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties MaxTags, MinConfidence, Name are required. +type ExtensionConfigAutoTaggingParam struct { + // Maximum number of tags to attach to the asset. + MaxTags int64 `json:"maxTags,required"` + // Minimum confidence level for tags to be considered valid. + MinConfidence int64 `json:"minConfidence,required"` + // Specifies the auto-tagging extension used. + // + // Any of "google-auto-tagging", "aws-auto-tagging". + Name string `json:"name,omitzero,required"` + paramObj +} + +func (r ExtensionConfigAutoTaggingParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAutoTaggingParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAutoTaggingParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func init() { + apijson.RegisterFieldValidator[ExtensionConfigAutoTaggingParam]( + "name", "google-auto-tagging", "aws-auto-tagging", + ) +} + +func NewExtensionConfigAIAutoDescriptionParam() ExtensionConfigAIAutoDescriptionParam { + return ExtensionConfigAIAutoDescriptionParam{ + Name: "ai-auto-description", + } +} + +// This struct has a constant value, construct it with +// [NewExtensionConfigAIAutoDescriptionParam]. +type ExtensionConfigAIAutoDescriptionParam struct { + // Specifies the auto description extension. + Name constant.AIAutoDescription `json:"name,required"` + paramObj +} + +func (r ExtensionConfigAIAutoDescriptionParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAIAutoDescriptionParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAIAutoDescriptionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Name, Tasks are required. +type ExtensionConfigAITasksParam struct { + // Array of task objects defining AI operations to perform on the asset. + Tasks []ExtensionConfigAITasksTaskUnionParam `json:"tasks,omitzero,required"` + // Specifies the AI tasks extension for automated image analysis using AI models. + // + // This field can be elided, and will marshal its zero value as "ai-tasks". + Name constant.AITasks `json:"name,required"` + paramObj +} + +func (r ExtensionConfigAITasksParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskUnionParam struct { + OfSelectTags *ExtensionConfigAITasksTaskSelectTagsParam `json:",omitzero,inline"` + OfSelectMetadata *ExtensionConfigAITasksTaskSelectMetadataParam `json:",omitzero,inline"` + OfYesNo *ExtensionConfigAITasksTaskYesNoParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfSelectTags, u.OfSelectMetadata, u.OfYesNo) +} +func (u *ExtensionConfigAITasksTaskUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskUnionParam) asAny() any { + if !param.IsOmitted(u.OfSelectTags) { + return u.OfSelectTags + } else if !param.IsOmitted(u.OfSelectMetadata) { + return u.OfSelectMetadata + } else if !param.IsOmitted(u.OfYesNo) { + return u.OfYesNo + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetField() *string { + if vt := u.OfSelectMetadata; vt != nil { + return &vt.Field + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetOnNo() *ExtensionConfigAITasksTaskYesNoOnNoParam { + if vt := u.OfYesNo; vt != nil { + return &vt.OnNo + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetOnUnknown() *ExtensionConfigAITasksTaskYesNoOnUnknownParam { + if vt := u.OfYesNo; vt != nil { + return &vt.OnUnknown + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetOnYes() *ExtensionConfigAITasksTaskYesNoOnYesParam { + if vt := u.OfYesNo; vt != nil { + return &vt.OnYes + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetInstruction() *string { + if vt := u.OfSelectTags; vt != nil { + return (*string)(&vt.Instruction) + } else if vt := u.OfSelectMetadata; vt != nil { + return (*string)(&vt.Instruction) + } else if vt := u.OfYesNo; vt != nil { + return (*string)(&vt.Instruction) + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetType() *string { + if vt := u.OfSelectTags; vt != nil { + return (*string)(&vt.Type) + } else if vt := u.OfSelectMetadata; vt != nil { + return (*string)(&vt.Type) + } else if vt := u.OfYesNo; vt != nil { + return (*string)(&vt.Type) + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetMaxSelections() *int64 { + if vt := u.OfSelectTags; vt != nil && vt.MaxSelections.Valid() { + return &vt.MaxSelections.Value + } else if vt := u.OfSelectMetadata; vt != nil && vt.MaxSelections.Valid() { + return &vt.MaxSelections.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionConfigAITasksTaskUnionParam) GetMinSelections() *int64 { + if vt := u.OfSelectTags; vt != nil && vt.MinSelections.Valid() { + return &vt.MinSelections.Value + } else if vt := u.OfSelectMetadata; vt != nil && vt.MinSelections.Valid() { + return &vt.MinSelections.Value + } + return nil +} + +// Returns a subunion which exports methods to access subproperties +// +// Or use AsAny() to get the underlying value +func (u ExtensionConfigAITasksTaskUnionParam) GetVocabulary() (res extensionConfigAITasksTaskUnionParamVocabulary) { + if vt := u.OfSelectTags; vt != nil { + res.any = &vt.Vocabulary + } else if vt := u.OfSelectMetadata; vt != nil { + res.any = &vt.Vocabulary + } + return +} + +// Can have the runtime types [_[]string], +// [_[]ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam] +type extensionConfigAITasksTaskUnionParamVocabulary struct{ any } + +// Use the following switch statement to get the type of the union: +// +// switch u.AsAny().(type) { +// case *[]string: +// case *[]shared.ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam: +// default: +// fmt.Errorf("not present") +// } +func (u extensionConfigAITasksTaskUnionParamVocabulary) AsAny() any { return u.any } + +func init() { + apijson.RegisterUnion[ExtensionConfigAITasksTaskUnionParam]( + "type", + apijson.Discriminator[ExtensionConfigAITasksTaskSelectTagsParam]("select_tags"), + apijson.Discriminator[ExtensionConfigAITasksTaskSelectMetadataParam]("select_metadata"), + apijson.Discriminator[ExtensionConfigAITasksTaskYesNoParam]("yes_no"), + ) +} + +// The properties Instruction, Type, Vocabulary are required. +type ExtensionConfigAITasksTaskSelectTagsParam struct { + // The question or instruction for the AI to analyze the image. + Instruction string `json:"instruction,required"` + // Array of possible tag values. Combined length of all strings must not exceed 500 + // characters. Cannot contain the `%` character. + Vocabulary []string `json:"vocabulary,omitzero,required"` + // Maximum number of tags to select from the vocabulary. + MaxSelections param.Opt[int64] `json:"max_selections,omitzero"` + // Minimum number of tags to select from the vocabulary. + MinSelections param.Opt[int64] `json:"min_selections,omitzero"` + // Task type that analyzes the image and adds matching tags from a vocabulary. + // + // This field can be elided, and will marshal its zero value as "select_tags". + Type constant.SelectTags `json:"type,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskSelectTagsParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskSelectTagsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskSelectTagsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Field, Instruction, Type are required. +type ExtensionConfigAITasksTaskSelectMetadataParam struct { + // Name of the custom metadata field to set. The field must exist in your account. + Field string `json:"field,required"` + // The question or instruction for the AI to analyze the image. + Instruction string `json:"instruction,required"` + // Maximum number of values to select from the vocabulary. + MaxSelections param.Opt[int64] `json:"max_selections,omitzero"` + // Minimum number of values to select from the vocabulary. + MinSelections param.Opt[int64] `json:"min_selections,omitzero"` + // Array of possible values matching the custom metadata field type. + Vocabulary []ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam `json:"vocabulary,omitzero"` + // Task type that analyzes the image and sets a custom metadata field value from a + // vocabulary. + // + // This field can be elided, and will marshal its zero value as "select_metadata". + Type constant.SelectMetadata `json:"type,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskSelectMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskSelectMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskSelectMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The properties Instruction, Type are required. +type ExtensionConfigAITasksTaskYesNoParam struct { + // The yes/no question for the AI to answer about the image. + Instruction string `json:"instruction,required"` + // Actions to execute if the AI answers no. + OnNo ExtensionConfigAITasksTaskYesNoOnNoParam `json:"on_no,omitzero"` + // Actions to execute if the AI cannot determine the answer. + OnUnknown ExtensionConfigAITasksTaskYesNoOnUnknownParam `json:"on_unknown,omitzero"` + // Actions to execute if the AI answers yes. + OnYes ExtensionConfigAITasksTaskYesNoOnYesParam `json:"on_yes,omitzero"` + // Task type that asks a yes/no question and executes actions based on the answer. + // + // This field can be elided, and will marshal its zero value as "yes_no". + Type constant.YesNo `json:"type,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Actions to execute if the AI answers no. +type ExtensionConfigAITasksTaskYesNoOnNoParam struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags,omitzero"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags,omitzero"` + // Array of custom metadata field updates. + SetMetadata []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam `json:"set_metadata,omitzero"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam `json:"unset_metadata,omitzero"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnNoParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnNoParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnNoParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Field, Value are required. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam `json:"value,omitzero,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfMixed []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed) +} +func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfMixed) { + return &u.OfMixed + } + return nil +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The property Field is required. +type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Actions to execute if the AI cannot determine the answer. +type ExtensionConfigAITasksTaskYesNoOnUnknownParam struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags,omitzero"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags,omitzero"` + // Array of custom metadata field updates. + SetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam `json:"set_metadata,omitzero"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam `json:"unset_metadata,omitzero"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnUnknownParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnUnknownParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Field, Value are required. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam `json:"value,omitzero,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfMixed []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed) +} +func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfMixed) { + return &u.OfMixed + } + return nil +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The property Field is required. +type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Actions to execute if the AI answers yes. +type ExtensionConfigAITasksTaskYesNoOnYesParam struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags,omitzero"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags,omitzero"` + // Array of custom metadata field updates. + SetMetadata []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam `json:"set_metadata,omitzero"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam `json:"unset_metadata,omitzero"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnYesParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnYesParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnYesParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Field, Value are required. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam `json:"value,omitzero,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfMixed []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed) +} +func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfMixed) { + return &u.OfMixed + } + return nil +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The property Field is required. +type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + paramObj +} + +func (r ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionsParam []ExtensionUnionParam + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionUnionParam struct { + OfRemoveBg *ExtensionRemoveBgParam `json:",omitzero,inline"` + OfAutoTagging *ExtensionAutoTaggingParam `json:",omitzero,inline"` + OfAIAutoDescription *ExtensionAIAutoDescriptionParam `json:",omitzero,inline"` + OfAITasks *ExtensionAITasksParam `json:",omitzero,inline"` + OfSavedExtension *ExtensionSavedExtensionParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfRemoveBg, + u.OfAutoTagging, + u.OfAIAutoDescription, + u.OfAITasks, + u.OfSavedExtension) +} +func (u *ExtensionUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionUnionParam) asAny() any { + if !param.IsOmitted(u.OfRemoveBg) { + return u.OfRemoveBg + } else if !param.IsOmitted(u.OfAutoTagging) { + return u.OfAutoTagging + } else if !param.IsOmitted(u.OfAIAutoDescription) { + return u.OfAIAutoDescription + } else if !param.IsOmitted(u.OfAITasks) { + return u.OfAITasks + } else if !param.IsOmitted(u.OfSavedExtension) { + return u.OfSavedExtension + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionUnionParam) GetOptions() *ExtensionRemoveBgOptionsParam { + if vt := u.OfRemoveBg; vt != nil { + return &vt.Options + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionUnionParam) GetMaxTags() *int64 { + if vt := u.OfAutoTagging; vt != nil { + return &vt.MaxTags + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionUnionParam) GetMinConfidence() *int64 { + if vt := u.OfAutoTagging; vt != nil { + return &vt.MinConfidence + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionUnionParam) GetTasks() []ExtensionAITasksTaskUnionParam { + if vt := u.OfAITasks; vt != nil { + return vt.Tasks + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionUnionParam) GetID() *string { + if vt := u.OfSavedExtension; vt != nil { + return &vt.ID + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionUnionParam) GetName() *string { + if vt := u.OfRemoveBg; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfAutoTagging; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfAIAutoDescription; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfAITasks; vt != nil { + return (*string)(&vt.Name) + } else if vt := u.OfSavedExtension; vt != nil { + return (*string)(&vt.Name) + } + return nil +} + +func init() { + apijson.RegisterUnion[ExtensionUnionParam]( + "name", + apijson.Discriminator[ExtensionRemoveBgParam]("remove-bg"), + apijson.Discriminator[ExtensionAutoTaggingParam]("google-auto-tagging"), + apijson.Discriminator[ExtensionAutoTaggingParam]("aws-auto-tagging"), + apijson.Discriminator[ExtensionAIAutoDescriptionParam]("ai-auto-description"), + apijson.Discriminator[ExtensionAITasksParam]("ai-tasks"), + apijson.Discriminator[ExtensionSavedExtensionParam]("saved-extension"), + ) +} + +// The property Name is required. +type ExtensionRemoveBgParam struct { + Options ExtensionRemoveBgOptionsParam `json:"options,omitzero"` + // Specifies the background removal extension. + // + // This field can be elided, and will marshal its zero value as "remove-bg". + Name constant.RemoveBg `json:"name,required"` + paramObj +} + +func (r ExtensionRemoveBgParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionRemoveBgParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionRemoveBgParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +type ExtensionRemoveBgOptionsParam struct { + // Whether to add an artificial shadow to the result. Default is false. Note: + // Adding shadows is currently only supported for car photos. + AddShadow param.Opt[bool] `json:"add_shadow,omitzero"` + // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or + // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be + // empty. + BgColor param.Opt[string] `json:"bg_color,omitzero"` + // Sets a background image from a URL. If this parameter is set, `bg_color` must be + // empty. + BgImageURL param.Opt[string] `json:"bg_image_url,omitzero"` + // Allows semi-transparent regions in the result. Default is true. Note: + // Semitransparency is currently only supported for car windows. + Semitransparency param.Opt[bool] `json:"semitransparency,omitzero"` + paramObj +} + +func (r ExtensionRemoveBgOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionRemoveBgOptionsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionRemoveBgOptionsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties MaxTags, MinConfidence, Name are required. +type ExtensionAutoTaggingParam struct { + // Maximum number of tags to attach to the asset. + MaxTags int64 `json:"maxTags,required"` + // Minimum confidence level for tags to be considered valid. + MinConfidence int64 `json:"minConfidence,required"` + // Specifies the auto-tagging extension used. + // + // Any of "google-auto-tagging", "aws-auto-tagging". + Name string `json:"name,omitzero,required"` + paramObj +} + +func (r ExtensionAutoTaggingParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAutoTaggingParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAutoTaggingParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +func init() { + apijson.RegisterFieldValidator[ExtensionAutoTaggingParam]( + "name", "google-auto-tagging", "aws-auto-tagging", + ) +} + +func NewExtensionAIAutoDescriptionParam() ExtensionAIAutoDescriptionParam { + return ExtensionAIAutoDescriptionParam{ + Name: "ai-auto-description", + } +} + +// This struct has a constant value, construct it with +// [NewExtensionAIAutoDescriptionParam]. +type ExtensionAIAutoDescriptionParam struct { + // Specifies the auto description extension. + Name constant.AIAutoDescription `json:"name,required"` + paramObj +} + +func (r ExtensionAIAutoDescriptionParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAIAutoDescriptionParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAIAutoDescriptionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Name, Tasks are required. +type ExtensionAITasksParam struct { + // Array of task objects defining AI operations to perform on the asset. + Tasks []ExtensionAITasksTaskUnionParam `json:"tasks,omitzero,required"` + // Specifies the AI tasks extension for automated image analysis using AI models. + // + // This field can be elided, and will marshal its zero value as "ai-tasks". + Name constant.AITasks `json:"name,required"` + paramObj +} + +func (r ExtensionAITasksParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskUnionParam struct { + OfSelectTags *ExtensionAITasksTaskSelectTagsParam `json:",omitzero,inline"` + OfSelectMetadata *ExtensionAITasksTaskSelectMetadataParam `json:",omitzero,inline"` + OfYesNo *ExtensionAITasksTaskYesNoParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionAITasksTaskUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfSelectTags, u.OfSelectMetadata, u.OfYesNo) +} +func (u *ExtensionAITasksTaskUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionAITasksTaskUnionParam) asAny() any { + if !param.IsOmitted(u.OfSelectTags) { + return u.OfSelectTags + } else if !param.IsOmitted(u.OfSelectMetadata) { + return u.OfSelectMetadata + } else if !param.IsOmitted(u.OfYesNo) { + return u.OfYesNo + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetField() *string { + if vt := u.OfSelectMetadata; vt != nil { + return &vt.Field + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetOnNo() *ExtensionAITasksTaskYesNoOnNoParam { + if vt := u.OfYesNo; vt != nil { + return &vt.OnNo + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetOnUnknown() *ExtensionAITasksTaskYesNoOnUnknownParam { + if vt := u.OfYesNo; vt != nil { + return &vt.OnUnknown + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetOnYes() *ExtensionAITasksTaskYesNoOnYesParam { + if vt := u.OfYesNo; vt != nil { + return &vt.OnYes + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetInstruction() *string { + if vt := u.OfSelectTags; vt != nil { + return (*string)(&vt.Instruction) + } else if vt := u.OfSelectMetadata; vt != nil { + return (*string)(&vt.Instruction) + } else if vt := u.OfYesNo; vt != nil { + return (*string)(&vt.Instruction) + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetType() *string { + if vt := u.OfSelectTags; vt != nil { + return (*string)(&vt.Type) + } else if vt := u.OfSelectMetadata; vt != nil { + return (*string)(&vt.Type) + } else if vt := u.OfYesNo; vt != nil { + return (*string)(&vt.Type) + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetMaxSelections() *int64 { + if vt := u.OfSelectTags; vt != nil && vt.MaxSelections.Valid() { + return &vt.MaxSelections.Value + } else if vt := u.OfSelectMetadata; vt != nil && vt.MaxSelections.Valid() { + return &vt.MaxSelections.Value + } + return nil +} + +// Returns a pointer to the underlying variant's property, if present. +func (u ExtensionAITasksTaskUnionParam) GetMinSelections() *int64 { + if vt := u.OfSelectTags; vt != nil && vt.MinSelections.Valid() { + return &vt.MinSelections.Value + } else if vt := u.OfSelectMetadata; vt != nil && vt.MinSelections.Valid() { + return &vt.MinSelections.Value + } + return nil +} + +// Returns a subunion which exports methods to access subproperties +// +// Or use AsAny() to get the underlying value +func (u ExtensionAITasksTaskUnionParam) GetVocabulary() (res extensionAITasksTaskUnionParamVocabulary) { + if vt := u.OfSelectTags; vt != nil { + res.any = &vt.Vocabulary + } else if vt := u.OfSelectMetadata; vt != nil { + res.any = &vt.Vocabulary + } + return +} + +// Can have the runtime types [_[]string], +// [_[]ExtensionAITasksTaskSelectMetadataVocabularyUnionParam] +type extensionAITasksTaskUnionParamVocabulary struct{ any } + +// Use the following switch statement to get the type of the union: +// +// switch u.AsAny().(type) { +// case *[]string: +// case *[]shared.ExtensionAITasksTaskSelectMetadataVocabularyUnionParam: +// default: +// fmt.Errorf("not present") +// } +func (u extensionAITasksTaskUnionParamVocabulary) AsAny() any { return u.any } + +func init() { + apijson.RegisterUnion[ExtensionAITasksTaskUnionParam]( + "type", + apijson.Discriminator[ExtensionAITasksTaskSelectTagsParam]("select_tags"), + apijson.Discriminator[ExtensionAITasksTaskSelectMetadataParam]("select_metadata"), + apijson.Discriminator[ExtensionAITasksTaskYesNoParam]("yes_no"), + ) +} + +// The properties Instruction, Type, Vocabulary are required. +type ExtensionAITasksTaskSelectTagsParam struct { + // The question or instruction for the AI to analyze the image. + Instruction string `json:"instruction,required"` + // Array of possible tag values. Combined length of all strings must not exceed 500 + // characters. Cannot contain the `%` character. + Vocabulary []string `json:"vocabulary,omitzero,required"` + // Maximum number of tags to select from the vocabulary. + MaxSelections param.Opt[int64] `json:"max_selections,omitzero"` + // Minimum number of tags to select from the vocabulary. + MinSelections param.Opt[int64] `json:"min_selections,omitzero"` + // Task type that analyzes the image and adds matching tags from a vocabulary. + // + // This field can be elided, and will marshal its zero value as "select_tags". + Type constant.SelectTags `json:"type,required"` + paramObj +} + +func (r ExtensionAITasksTaskSelectTagsParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskSelectTagsParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskSelectTagsParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Field, Instruction, Type are required. +type ExtensionAITasksTaskSelectMetadataParam struct { + // Name of the custom metadata field to set. The field must exist in your account. + Field string `json:"field,required"` + // The question or instruction for the AI to analyze the image. + Instruction string `json:"instruction,required"` + // Maximum number of values to select from the vocabulary. + MaxSelections param.Opt[int64] `json:"max_selections,omitzero"` + // Minimum number of values to select from the vocabulary. + MinSelections param.Opt[int64] `json:"min_selections,omitzero"` + // Array of possible values matching the custom metadata field type. + Vocabulary []ExtensionAITasksTaskSelectMetadataVocabularyUnionParam `json:"vocabulary,omitzero"` + // Task type that analyzes the image and sets a custom metadata field value from a + // vocabulary. + // + // This field can be elided, and will marshal its zero value as "select_metadata". + Type constant.SelectMetadata `json:"type,required"` + paramObj +} + +func (r ExtensionAITasksTaskSelectMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskSelectMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskSelectMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskSelectMetadataVocabularyUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionAITasksTaskSelectMetadataVocabularyUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionAITasksTaskSelectMetadataVocabularyUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionAITasksTaskSelectMetadataVocabularyUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The properties Instruction, Type are required. +type ExtensionAITasksTaskYesNoParam struct { + // The yes/no question for the AI to answer about the image. + Instruction string `json:"instruction,required"` + // Actions to execute if the AI answers no. + OnNo ExtensionAITasksTaskYesNoOnNoParam `json:"on_no,omitzero"` + // Actions to execute if the AI cannot determine the answer. + OnUnknown ExtensionAITasksTaskYesNoOnUnknownParam `json:"on_unknown,omitzero"` + // Actions to execute if the AI answers yes. + OnYes ExtensionAITasksTaskYesNoOnYesParam `json:"on_yes,omitzero"` + // Task type that asks a yes/no question and executes actions based on the answer. + // + // This field can be elided, and will marshal its zero value as "yes_no". + Type constant.YesNo `json:"type,required"` + paramObj +} + +func (r ExtensionAITasksTaskYesNoParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskYesNoParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Actions to execute if the AI answers no. +type ExtensionAITasksTaskYesNoOnNoParam struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags,omitzero"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags,omitzero"` + // Array of custom metadata field updates. + SetMetadata []ExtensionAITasksTaskYesNoOnNoSetMetadataParam `json:"set_metadata,omitzero"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam `json:"unset_metadata,omitzero"` + paramObj +} + +func (r ExtensionAITasksTaskYesNoOnNoParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnNoParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskYesNoOnNoParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties Field, Value are required. +type ExtensionAITasksTaskYesNoOnNoSetMetadataParam struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam `json:"value,omitzero,required"` + paramObj +} + +func (r ExtensionAITasksTaskYesNoOnNoSetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnNoSetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskYesNoOnNoSetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfMixed []ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed) +} +func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfMixed) { + return &u.OfMixed + } + return nil +} + +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The property Field is required. +type ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` + paramObj +} -// aliased to make [param.APIObject] private when embedding -type paramObj = param.APIObject +func (r ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} -type BaseOverlayParam struct { - Position OverlayPositionParam `json:"position,omitzero"` - Timing OverlayTimingParam `json:"timing,omitzero"` +// Actions to execute if the AI cannot determine the answer. +type ExtensionAITasksTaskYesNoOnUnknownParam struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags,omitzero"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags,omitzero"` + // Array of custom metadata field updates. + SetMetadata []ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam `json:"set_metadata,omitzero"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam `json:"unset_metadata,omitzero"` paramObj } -func (r BaseOverlayParam) MarshalJSON() (data []byte, err error) { - type shadow BaseOverlayParam +func (r ExtensionAITasksTaskYesNoOnUnknownParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnUnknownParam return param.MarshalObject(r, (*shadow)(&r)) } -func (r *BaseOverlayParam) UnmarshalJSON(data []byte) error { +func (r *ExtensionAITasksTaskYesNoOnUnknownParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } -type ExtensionsParam []ExtensionUnionParam +// The properties Field, Value are required. +type ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam `json:"value,omitzero,required"` + paramObj +} + +func (r ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} // Only one field can be non-zero. // // Use [param.IsOmitted] to confirm if a field is set. -type ExtensionUnionParam struct { - OfRemoveBg *ExtensionRemoveBgParam `json:",omitzero,inline"` - OfAutoTagging *ExtensionAutoTaggingParam `json:",omitzero,inline"` - OfAIAutoDescription *ExtensionAIAutoDescriptionParam `json:",omitzero,inline"` +type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfMixed []ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"` paramUnion } -func (u ExtensionUnionParam) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfRemoveBg, u.OfAutoTagging, u.OfAIAutoDescription) +func (u ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed) } -func (u *ExtensionUnionParam) UnmarshalJSON(data []byte) error { +func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, u) } -func (u *ExtensionUnionParam) asAny() any { - if !param.IsOmitted(u.OfRemoveBg) { - return u.OfRemoveBg - } else if !param.IsOmitted(u.OfAutoTagging) { - return u.OfAutoTagging - } else if !param.IsOmitted(u.OfAIAutoDescription) { - return u.OfAIAutoDescription +func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfMixed) { + return &u.OfMixed } return nil } -// Returns a pointer to the underlying variant's property, if present. -func (u ExtensionUnionParam) GetOptions() *ExtensionRemoveBgOptionsParam { - if vt := u.OfRemoveBg; vt != nil { - return &vt.Options - } - return nil +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion } -// Returns a pointer to the underlying variant's property, if present. -func (u ExtensionUnionParam) GetMaxTags() *int64 { - if vt := u.OfAutoTagging; vt != nil { - return &vt.MaxTags - } - return nil +func (u ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) } - -// Returns a pointer to the underlying variant's property, if present. -func (u ExtensionUnionParam) GetMinConfidence() *int64 { - if vt := u.OfAutoTagging; vt != nil { - return &vt.MinConfidence - } - return nil +func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) } -// Returns a pointer to the underlying variant's property, if present. -func (u ExtensionUnionParam) GetName() *string { - if vt := u.OfRemoveBg; vt != nil { - return (*string)(&vt.Name) - } else if vt := u.OfAutoTagging; vt != nil { - return (*string)(&vt.Name) - } else if vt := u.OfAIAutoDescription; vt != nil { - return (*string)(&vt.Name) +func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value } return nil } -func init() { - apijson.RegisterUnion[ExtensionUnionParam]( - "name", - apijson.Discriminator[ExtensionRemoveBgParam]("remove-bg"), - apijson.Discriminator[ExtensionAutoTaggingParam]("google-auto-tagging"), - apijson.Discriminator[ExtensionAutoTaggingParam]("aws-auto-tagging"), - apijson.Discriminator[ExtensionAIAutoDescriptionParam]("ai-auto-description"), - ) -} - -// The property Name is required. -type ExtensionRemoveBgParam struct { - Options ExtensionRemoveBgOptionsParam `json:"options,omitzero"` - // Specifies the background removal extension. - // - // This field can be elided, and will marshal its zero value as "remove-bg". - Name constant.RemoveBg `json:"name,required"` +// The property Field is required. +type ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` paramObj } -func (r ExtensionRemoveBgParam) MarshalJSON() (data []byte, err error) { - type shadow ExtensionRemoveBgParam +func (r ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam return param.MarshalObject(r, (*shadow)(&r)) } -func (r *ExtensionRemoveBgParam) UnmarshalJSON(data []byte) error { +func (r *ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } -type ExtensionRemoveBgOptionsParam struct { - // Whether to add an artificial shadow to the result. Default is false. Note: - // Adding shadows is currently only supported for car photos. - AddShadow param.Opt[bool] `json:"add_shadow,omitzero"` - // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or - // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be - // empty. - BgColor param.Opt[string] `json:"bg_color,omitzero"` - // Sets a background image from a URL. If this parameter is set, `bg_color` must be - // empty. - BgImageURL param.Opt[string] `json:"bg_image_url,omitzero"` - // Allows semi-transparent regions in the result. Default is true. Note: - // Semitransparency is currently only supported for car windows. - Semitransparency param.Opt[bool] `json:"semitransparency,omitzero"` +// Actions to execute if the AI answers yes. +type ExtensionAITasksTaskYesNoOnYesParam struct { + // Array of tag strings to add to the asset. + AddTags []string `json:"add_tags,omitzero"` + // Array of tag strings to remove from the asset. + RemoveTags []string `json:"remove_tags,omitzero"` + // Array of custom metadata field updates. + SetMetadata []ExtensionAITasksTaskYesNoOnYesSetMetadataParam `json:"set_metadata,omitzero"` + // Array of custom metadata fields to remove. + UnsetMetadata []ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam `json:"unset_metadata,omitzero"` paramObj } -func (r ExtensionRemoveBgOptionsParam) MarshalJSON() (data []byte, err error) { - type shadow ExtensionRemoveBgOptionsParam +func (r ExtensionAITasksTaskYesNoOnYesParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnYesParam return param.MarshalObject(r, (*shadow)(&r)) } -func (r *ExtensionRemoveBgOptionsParam) UnmarshalJSON(data []byte) error { +func (r *ExtensionAITasksTaskYesNoOnYesParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } -// The properties MaxTags, MinConfidence, Name are required. -type ExtensionAutoTaggingParam struct { - // Maximum number of tags to attach to the asset. - MaxTags int64 `json:"maxTags,required"` - // Minimum confidence level for tags to be considered valid. - MinConfidence int64 `json:"minConfidence,required"` - // Specifies the auto-tagging extension used. - // - // Any of "google-auto-tagging", "aws-auto-tagging". - Name string `json:"name,omitzero,required"` +// The properties Field, Value are required. +type ExtensionAITasksTaskYesNoOnYesSetMetadataParam struct { + // Name of the custom metadata field to set. + Field string `json:"field,required"` + // Value to set for the custom metadata field. The value type should match the + // custom metadata field type. + Value ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam `json:"value,omitzero,required"` paramObj } -func (r ExtensionAutoTaggingParam) MarshalJSON() (data []byte, err error) { - type shadow ExtensionAutoTaggingParam +func (r ExtensionAITasksTaskYesNoOnYesSetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnYesSetMetadataParam return param.MarshalObject(r, (*shadow)(&r)) } -func (r *ExtensionAutoTaggingParam) UnmarshalJSON(data []byte) error { +func (r *ExtensionAITasksTaskYesNoOnYesSetMetadataParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } -func init() { - apijson.RegisterFieldValidator[ExtensionAutoTaggingParam]( - "name", "google-auto-tagging", "aws-auto-tagging", - ) +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + OfMixed []ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"` + paramUnion } -func NewExtensionAIAutoDescriptionParam() ExtensionAIAutoDescriptionParam { - return ExtensionAIAutoDescriptionParam{ - Name: "ai-auto-description", +func (u ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed) +} +func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } else if !param.IsOmitted(u.OfMixed) { + return &u.OfMixed } + return nil } -// This struct has a constant value, construct it with -// [NewExtensionAIAutoDescriptionParam]. -type ExtensionAIAutoDescriptionParam struct { - // Specifies the auto description extension. - Name constant.AIAutoDescription `json:"name,required"` +// Only one field can be non-zero. +// +// Use [param.IsOmitted] to confirm if a field is set. +type ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam struct { + OfString param.Opt[string] `json:",omitzero,inline"` + OfFloat param.Opt[float64] `json:",omitzero,inline"` + OfBool param.Opt[bool] `json:",omitzero,inline"` + paramUnion +} + +func (u ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) { + return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool) +} +func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, u) +} + +func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) asAny() any { + if !param.IsOmitted(u.OfString) { + return &u.OfString.Value + } else if !param.IsOmitted(u.OfFloat) { + return &u.OfFloat.Value + } else if !param.IsOmitted(u.OfBool) { + return &u.OfBool.Value + } + return nil +} + +// The property Field is required. +type ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam struct { + // Name of the custom metadata field to remove. + Field string `json:"field,required"` paramObj } -func (r ExtensionAIAutoDescriptionParam) MarshalJSON() (data []byte, err error) { - type shadow ExtensionAIAutoDescriptionParam +func (r ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam return param.MarshalObject(r, (*shadow)(&r)) } -func (r *ExtensionAIAutoDescriptionParam) UnmarshalJSON(data []byte) error { +func (r *ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// The properties ID, Name are required. +type ExtensionSavedExtensionParam struct { + // The unique ID of the saved extension to apply. + ID string `json:"id,required"` + // Indicates this is a reference to a saved extension. + // + // This field can be elided, and will marshal its zero value as "saved-extension". + Name constant.SavedExtension `json:"name,required"` + paramObj +} + +func (r ExtensionSavedExtensionParam) MarshalJSON() (data []byte, err error) { + type shadow ExtensionSavedExtensionParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ExtensionSavedExtensionParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } +// Options for generating responsive image attributes including `src`, `srcSet`, +// and `sizes` for HTML `` elements. This schema extends `SrcOptions` to add +// support for responsive image generation with breakpoints. +type GetImageAttributesOptionsParam struct { + // Custom list of **device-width breakpoints** in pixels. These define common + // screen widths for responsive image generation. + // + // Defaults to `[640, 750, 828, 1080, 1200, 1920, 2048, 3840]`. Sorted + // automatically. + DeviceBreakpoints []float64 `json:"deviceBreakpoints,omitzero"` + // Custom list of **image-specific breakpoints** in pixels. Useful for generating + // small variants (e.g., placeholders or thumbnails). + // + // Merged with `deviceBreakpoints` before calculating `srcSet`. Defaults to + // `[16, 32, 48, 64, 96, 128, 256, 384]`. Sorted automatically. + ImageBreakpoints []float64 `json:"imageBreakpoints,omitzero"` + // The value for the HTML `sizes` attribute (e.g., `"100vw"` or + // `"(min-width:768px) 50vw, 100vw"`). + // + // - If it includes one or more `vw` units, breakpoints smaller than the + // corresponding percentage of the smallest device width are excluded. + // - If it contains no `vw` units, the full breakpoint list is used. + // + // Enables a width-based strategy and generates `w` descriptors in `srcSet`. + Sizes param.Opt[string] `json:"sizes,omitzero"` + // The intended display width of the image in pixels, used **only when the `sizes` + // attribute is not provided**. + // + // Triggers a DPR-based strategy (1x and 2x variants) and generates `x` descriptors + // in `srcSet`. + // + // Ignored if `sizes` is present. + Width param.Opt[float64] `json:"width,omitzero"` + SrcOptionsParam +} + +func (r GetImageAttributesOptionsParam) MarshalJSON() (data []byte, err error) { + type shadow struct { + *GetImageAttributesOptionsParam + MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field + } + return param.MarshalObject(r, shadow{&r, false}) +} + type ImageOverlayParam struct { // Specifies the relative path to the image used as an overlay. Input string `json:"input,required"` @@ -205,6 +2699,12 @@ type ImageOverlayParam struct { // format automatically. To always use base64 encoding (`ie-{base64}`), set this // parameter to `base64`. To always use plain text (`i-{input}`), set it to // `plain`. + // + // Regardless of the encoding method: + // + // - Leading and trailing slashes are removed. + // - Remaining slashes within the path are replaced with `@@` when using plain + // text. Encoding string `json:"encoding,omitzero"` // Array of transformations to be applied to the overlay image. Supported // transformations depends on the base/parent asset. See overlays on @@ -216,8 +2716,11 @@ type ImageOverlayParam struct { } func (r ImageOverlayParam) MarshalJSON() (data []byte, err error) { - type shadow ImageOverlayParam - return param.MarshalObject(r, (*shadow)(&r)) + type shadow struct { + *ImageOverlayParam + MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field + } + return param.MarshalObject(r, shadow{&r, false}) } func OverlayParamOfText(text string) OverlayUnionParam { @@ -304,6 +2807,22 @@ func (u OverlayUnionParam) GetColor() *string { return nil } +// Returns a pointer to the underlying variant's property, if present. +func (u OverlayUnionParam) GetLayerMode() *string { + if vt := u.OfText; vt != nil { + return (*string)(&vt.LayerMode) + } else if vt := u.OfImage; vt != nil { + return (*string)(&vt.LayerMode) + } else if vt := u.OfVideo; vt != nil { + return (*string)(&vt.LayerMode) + } else if vt := u.OfSubtitle; vt != nil { + return (*string)(&vt.LayerMode) + } else if vt := u.OfSolidColor; vt != nil { + return (*string)(&vt.LayerMode) + } + return nil +} + // Returns a pointer to the underlying variant's property, if present. func (u OverlayUnionParam) GetType() *string { if vt := u.OfText; vt != nil { @@ -623,6 +3142,101 @@ func (u *OverlayTimingStartUnionParam) asAny() any { return nil } +// Resulting set of attributes suitable for an HTML `` element. Useful for +// enabling responsive image loading with `srcSet` and `sizes`. +// +// The property Src is required. +type ResponsiveImageAttributesParam struct { + // URL for the _largest_ candidate (assigned to plain `src`). + Src string `json:"src,required" format:"uri"` + // `sizes` returned (or synthesised as `100vw`). The value for the HTML `sizes` + // attribute. + Sizes param.Opt[string] `json:"sizes,omitzero"` + // Candidate set with `w` or `x` descriptors. Multiple image URLs separated by + // commas, each with a descriptor. + SrcSet param.Opt[string] `json:"srcSet,omitzero"` + // Width as a number (if `width` was provided in the input options). + Width param.Opt[float64] `json:"width,omitzero"` + paramObj +} + +func (r ResponsiveImageAttributesParam) MarshalJSON() (data []byte, err error) { + type shadow ResponsiveImageAttributesParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *ResponsiveImageAttributesParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// Saved extension object containing extension configuration. +type SavedExtension struct { + // Unique identifier of the saved extension. + ID string `json:"id"` + // Configuration object for an extension (base extensions only, not saved extension + // references). + Config ExtensionConfigUnion `json:"config"` + // Timestamp when the saved extension was created. + CreatedAt time.Time `json:"createdAt" format:"date-time"` + // Description of the saved extension. + Description string `json:"description"` + // Name of the saved extension. + Name string `json:"name"` + // Timestamp when the saved extension was last updated. + UpdatedAt time.Time `json:"updatedAt" format:"date-time"` + // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. + JSON struct { + ID respjson.Field + Config respjson.Field + CreatedAt respjson.Field + Description respjson.Field + Name respjson.Field + UpdatedAt respjson.Field + ExtraFields map[string]respjson.Field + raw string + } `json:"-"` +} + +// Returns the unmodified JSON received from the API +func (r SavedExtension) RawJSON() string { return r.JSON.raw } +func (r *SavedExtension) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + +// ToParam converts this SavedExtension to a SavedExtensionParam. +// +// Warning: the fields of the param type will not be present. ToParam should only +// be used at the last possible moment before sending a request. Test for this with +// SavedExtensionParam.Overrides() +func (r SavedExtension) ToParam() SavedExtensionParam { + return param.Override[SavedExtensionParam](json.RawMessage(r.RawJSON())) +} + +// Saved extension object containing extension configuration. +type SavedExtensionParam struct { + // Unique identifier of the saved extension. + ID param.Opt[string] `json:"id,omitzero"` + // Timestamp when the saved extension was created. + CreatedAt param.Opt[time.Time] `json:"createdAt,omitzero" format:"date-time"` + // Description of the saved extension. + Description param.Opt[string] `json:"description,omitzero"` + // Name of the saved extension. + Name param.Opt[string] `json:"name,omitzero"` + // Timestamp when the saved extension was last updated. + UpdatedAt param.Opt[time.Time] `json:"updatedAt,omitzero" format:"date-time"` + // Configuration object for an extension (base extensions only, not saved extension + // references). + Config ExtensionConfigUnionParam `json:"config,omitzero"` + paramObj +} + +func (r SavedExtensionParam) MarshalJSON() (data []byte, err error) { + type shadow SavedExtensionParam + return param.MarshalObject(r, (*shadow)(&r)) +} +func (r *SavedExtensionParam) UnmarshalJSON(data []byte) error { + return apijson.UnmarshalRoot(data, r) +} + type SolidColorOverlayParam struct { // Specifies the color of the block using an RGB hex code (e.g., `FF0000`), an RGBA // code (e.g., `FFAABB50`), or a color name (e.g., `red`). If an 8-character value @@ -640,13 +3254,16 @@ type SolidColorOverlayParam struct { } func (r SolidColorOverlayParam) MarshalJSON() (data []byte, err error) { - type shadow SolidColorOverlayParam - return param.MarshalObject(r, (*shadow)(&r)) + type shadow struct { + *SolidColorOverlayParam + MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field + } + return param.MarshalObject(r, shadow{&r, false}) } type SolidColorOverlayTransformationParam struct { - // Specifies the transparency level of the solid color overlay. Accepts integers - // from `1` to `9`. + // Specifies the transparency level of the overlaid solid color layer. Supports + // integers from `1` to `9`. Alpha param.Opt[float64] `json:"alpha,omitzero"` // Specifies the background color of the solid color overlay. Accepts an RGB hex // code (e.g., `FF0000`), an RGBA code (e.g., `FFAABB50`), or a color name. @@ -660,9 +3277,14 @@ type SolidColorOverlayTransformationParam struct { // arithmetic expression. Learn about // [arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations). Height SolidColorOverlayTransformationHeightUnionParam `json:"height,omitzero"` - // Specifies the corner radius of the solid color overlay. Set to `max` for - // circular or oval shape. See - // [radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). + // Specifies the corner radius of the solid color overlay. + // + // - Single value (positive integer): Applied to all corners (e.g., `20`). + // - `max`: Creates a circular or oval shape. + // - Per-corner array: Provide four underscore-separated values representing + // top-left, top-right, bottom-right, and bottom-left corners respectively (e.g., + // `10_20_30_40`). See + // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). Radius SolidColorOverlayTransformationRadiusUnionParam `json:"radius,omitzero"` // Controls the width of the solid color overlay. Accepts a numeric value or an // arithmetic expression (e.g., `bw_mul_0.2` or `bh_div_2`). Learn about @@ -742,12 +3364,13 @@ func (u *SolidColorOverlayTransformationHeightUnionParam) asAny() any { type SolidColorOverlayTransformationRadiusUnionParam struct { OfFloat param.Opt[float64] `json:",omitzero,inline"` // Construct this variant with constant.ValueOf[constant.Max]() - OfMax constant.Max `json:",omitzero,inline"` + OfMax constant.Max `json:",omitzero,inline"` + OfString param.Opt[string] `json:",omitzero,inline"` paramUnion } func (u SolidColorOverlayTransformationRadiusUnionParam) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfFloat, u.OfMax) + return param.MarshalUnion(u, u.OfFloat, u.OfMax, u.OfString) } func (u *SolidColorOverlayTransformationRadiusUnionParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, u) @@ -758,6 +3381,8 @@ func (u *SolidColorOverlayTransformationRadiusUnionParam) asAny() any { return &u.OfFloat.Value } else if !param.IsOmitted(u.OfMax) { return &u.OfMax + } else if !param.IsOmitted(u.OfString) { + return &u.OfString.Value } return nil } @@ -866,6 +3491,12 @@ type SubtitleOverlayParam struct { // format automatically. To always use base64 encoding (`ie-{base64}`), set this // parameter to `base64`. To always use plain text (`i-{input}`), set it to // `plain`. + // + // Regardless of the encoding method: + // + // - Leading and trailing slashes are removed. + // - Remaining slashes within the path are replaced with `@@` when using plain + // text. Encoding string `json:"encoding,omitzero"` // Control styling of the subtitle. See // [Styling subtitles](https://imagekit.io/docs/add-overlays-on-videos#styling-controls-for-subtitles-layer). @@ -874,8 +3505,11 @@ type SubtitleOverlayParam struct { } func (r SubtitleOverlayParam) MarshalJSON() (data []byte, err error) { - type shadow SubtitleOverlayParam - return param.MarshalObject(r, (*shadow)(&r)) + type shadow struct { + *SubtitleOverlayParam + MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field + } + return param.MarshalObject(r, shadow{&r, false}) } // Subtitle styling options. @@ -892,8 +3526,9 @@ type SubtitleOverlayTransformationParam struct { // // [Subtitle styling options](https://imagekit.io/docs/add-overlays-on-videos#styling-controls-for-subtitles-layer) Color param.Opt[string] `json:"color,omitzero"` - // Font family for subtitles. Refer to the - // [supported fonts](https://imagekit.io/docs/add-overlays-on-images#supported-text-font-list). + // Sets the font family of subtitle text. Refer to the + // [supported fonts documented](https://imagekit.io/docs/add-overlays-on-images#supported-text-font-list) + // in the ImageKit transformations guide. FontFamily param.Opt[string] `json:"fontFamily,omitzero"` // Sets the font outline of the subtitle text. Requires the outline width (an // integer) and the outline color (as an RGB color code, RGBA color code, or @@ -956,6 +3591,9 @@ type TextOverlayParam struct { // appropriate format based on the input text. To always use base64 // (`ie-{base64}`), set this parameter to `base64`. To always use plain text // (`i-{input}`), set it to `plain`. + // + // Regardless of the encoding method, the input text is always percent-encoded to + // ensure it is URL-safe. Encoding string `json:"encoding,omitzero"` // Control styling of the text overlay. See // [Text overlays](https://imagekit.io/docs/add-overlays-on-images#text-overlay). @@ -964,8 +3602,11 @@ type TextOverlayParam struct { } func (r TextOverlayParam) MarshalJSON() (data []byte, err error) { - type shadow TextOverlayParam - return param.MarshalObject(r, (*shadow)(&r)) + type shadow struct { + *TextOverlayParam + MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field + } + return param.MarshalObject(r, shadow{&r, false}) } type TextOverlayTransformationParam struct { @@ -990,7 +3631,9 @@ type TextOverlayTransformationParam struct { // - Combinations: Any combination separated by underscores, e.g., `b_i`, // `b_i_strikethrough`. Typography param.Opt[string] `json:"typography,omitzero"` - // Flip the text overlay horizontally, vertically, or both. + // Flip/mirror the text horizontally, vertically, or in both directions. Acceptable + // values: `h` (horizontal), `v` (vertical), `h_v` (horizontal and vertical), or + // `v_h`. // // Any of "h", "v", "h_v", "v_h". Flip TextOverlayTransformationFlip `json:"flip,omitzero"` @@ -1002,17 +3645,22 @@ type TextOverlayTransformationParam struct { // // Any of "left", "right", "center". InnerAlignment TextOverlayTransformationInnerAlignment `json:"innerAlignment,omitzero"` - // Specifies the line height of the text overlay. Accepts integer values - // representing line height in points. It can also accept - // [arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations) - // such as `bw_mul_0.2`, or `bh_div_20`. + // Specifies the line height for multi-line text overlays. It will come into effect + // only if the text wraps over multiple lines. Accepts either an integer value or + // an arithmetic expression. LineHeight TextOverlayTransformationLineHeightUnionParam `json:"lineHeight,omitzero"` // Specifies the padding around the overlaid text. Can be provided as a single // positive integer or multiple values separated by underscores (following CSS // shorthand order). Arithmetic expressions are also accepted. Padding TextOverlayTransformationPaddingUnionParam `json:"padding,omitzero"` - // Specifies the corner radius of the text overlay. Set to `max` to achieve a - // circular or oval shape. + // Specifies the corner radius: + // + // - Single value (positive integer): Applied to all corners (e.g., `20`). + // - `max`: Creates a circular or oval shape. + // - Per-corner array: Provide four underscore-separated values representing + // top-left, top-right, bottom-right, and bottom-left corners respectively (e.g., + // `10_20_30_40`). See + // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). Radius TextOverlayTransformationRadiusUnionParam `json:"radius,omitzero"` // Specifies the rotation angle of the text overlay. Accepts a numeric value for // clockwise rotation or a string prefixed with "N" for counter-clockwise rotation. @@ -1033,7 +3681,9 @@ func (r *TextOverlayTransformationParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, r) } -// Flip the text overlay horizontally, vertically, or both. +// Flip/mirror the text horizontally, vertically, or in both directions. Acceptable +// values: `h` (horizontal), `v` (vertical), `h_v` (horizontal and vertical), or +// `v_h`. type TextOverlayTransformationFlip string const ( @@ -1134,12 +3784,13 @@ func (u *TextOverlayTransformationPaddingUnionParam) asAny() any { type TextOverlayTransformationRadiusUnionParam struct { OfFloat param.Opt[float64] `json:",omitzero,inline"` // Construct this variant with constant.ValueOf[constant.Max]() - OfMax constant.Max `json:",omitzero,inline"` + OfMax constant.Max `json:",omitzero,inline"` + OfString param.Opt[string] `json:",omitzero,inline"` paramUnion } func (u TextOverlayTransformationRadiusUnionParam) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfFloat, u.OfMax) + return param.MarshalUnion(u, u.OfFloat, u.OfMax, u.OfString) } func (u *TextOverlayTransformationRadiusUnionParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, u) @@ -1150,6 +3801,8 @@ func (u *TextOverlayTransformationRadiusUnionParam) asAny() any { return &u.OfFloat.Value } else if !param.IsOmitted(u.OfMax) { return &u.OfMax + } else if !param.IsOmitted(u.OfString) { + return &u.OfString.Value } return nil } @@ -1226,6 +3879,12 @@ type TransformationParam struct { // // - A solid color: e.g., `red`, `F3F3F3`, `AAFF0010`. See // [Solid color background](https://imagekit.io/docs/effects-and-enhancements#solid-color-background). + // - Dominant color: `dominant` extracts the dominant color from the image. See + // [Dominant color background](https://imagekit.io/docs/effects-and-enhancements#dominant-color-background). + // - Gradient: `gradient_dominant` or `gradient_dominant_2` creates a gradient + // using the dominant colors. Optionally specify palette size (2 or 4), e.g., + // `gradient_dominant_4`. See + // [Gradient background](https://imagekit.io/docs/effects-and-enhancements#gradient-background). // - A blurred background: e.g., `blurred`, `blurred_25_N15`, etc. See // [Blurred background](https://imagekit.io/docs/effects-and-enhancements#blurred-background). // - Expand the image boundaries using generative fill: `genfill`. Not supported @@ -1246,13 +3905,33 @@ type TransformationParam struct { // Indicates whether the output image should retain the original color profile. See // [Color profile](https://imagekit.io/docs/image-optimization#color-profile---cp). ColorProfile param.Opt[bool] `json:"colorProfile,omitzero"` + // Replaces colors in the image. Supports three formats: + // + // - `toColor` - Replace dominant color with the specified color. + // - `toColor_tolerance` - Replace dominant color with specified tolerance (0-100). + // - `toColor_tolerance_fromColor` - Replace a specific color with another within + // tolerance range. Colors can be hex codes (e.g., `FF0022`) or names (e.g., + // `red`, `blue`). See + // [Color replacement](https://imagekit.io/docs/effects-and-enhancements#color-replace---cr). + ColorReplace param.Opt[string] `json:"colorReplace,omitzero"` // Specifies a fallback image if the resource is not found, e.g., a URL or file // path. See // [Default image](https://imagekit.io/docs/image-transformation#default-image---di). DefaultImage param.Opt[string] `json:"defaultImage,omitzero"` + // Distorts the shape of an image. Supports two modes: + // + // - Perspective distortion: `p-x1_y1_x2_y2_x3_y3_x4_y4` changes the position of + // the four corners starting clockwise from top-left. + // - Arc distortion: `a-degrees` curves the image upwards (positive values) or + // downwards (negative values). See + // [Distort effect](https://imagekit.io/docs/effects-and-enhancements#distort---e-distort). + Distort param.Opt[string] `json:"distort,omitzero"` // Accepts values between 0.1 and 5, or `auto` for automatic device pixel ratio - // (DPR) calculation. See - // [DPR](https://imagekit.io/docs/image-resize-and-crop#dpr---dpr). + // (DPR) calculation. Also accepts arithmetic expressions. + // + // - Learn about + // [Arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations). + // - See [DPR](https://imagekit.io/docs/image-resize-and-crop#dpr---dpr). Dpr param.Opt[float64] `json:"dpr,omitzero"` // Refines padding and cropping behavior for pad resize, maintain ratio, and // extract crop modes. Supports manual positions and coordinate-based focus. With @@ -1415,9 +4094,14 @@ type TransformationParam struct { // 2nd and 3rd layers), or by name (e.g., `name-layer-4` for a PSD layer). See // [Thumbnail extraction](https://imagekit.io/docs/vector-and-animated-images#get-thumbnail-from-psd-pdf-ai-eps-and-animated-files). Page TransformationPageUnionParam `json:"page,omitzero"` - // Specifies the corner radius for rounded corners (e.g., 20) or `max` for circular - // or oval shape. See - // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). + // Specifies the corner radius for rounded corners. + // + // - Single value (positive integer): Applied to all corners (e.g., `20`). + // - `max`: Creates a circular or oval shape. + // - Per-corner array: Provide four underscore-separated values representing + // top-left, top-right, bottom-right, and bottom-left corners respectively (e.g., + // `10_20_30_40`). See + // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r). Radius TransformationRadiusUnionParam `json:"radius,omitzero"` // Specifies the rotation angle in degrees. Positive values rotate the image // clockwise; you can also use, for example, `N40` for counterclockwise rotation or @@ -1771,12 +4455,13 @@ func (u *TransformationPageUnionParam) asAny() any { type TransformationRadiusUnionParam struct { OfFloat param.Opt[float64] `json:",omitzero,inline"` // Construct this variant with constant.ValueOf[constant.Max]() - OfMax constant.Max `json:",omitzero,inline"` + OfMax constant.Max `json:",omitzero,inline"` + OfString param.Opt[string] `json:",omitzero,inline"` paramUnion } func (u TransformationRadiusUnionParam) MarshalJSON() ([]byte, error) { - return param.MarshalUnion(u, u.OfFloat, u.OfMax) + return param.MarshalUnion(u, u.OfFloat, u.OfMax, u.OfString) } func (u *TransformationRadiusUnionParam) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, u) @@ -1787,6 +4472,8 @@ func (u *TransformationRadiusUnionParam) asAny() any { return &u.OfFloat.Value } else if !param.IsOmitted(u.OfMax) { return &u.OfMax + } else if !param.IsOmitted(u.OfString) { + return &u.OfString.Value } return nil } @@ -2125,6 +4812,12 @@ type VideoOverlayParam struct { // format automatically. To always use base64 encoding (`ie-{base64}`), set this // parameter to `base64`. To always use plain text (`i-{input}`), set it to // `plain`. + // + // Regardless of the encoding method: + // + // - Leading and trailing slashes are removed. + // - Remaining slashes within the path are replaced with `@@` when using plain + // text. Encoding string `json:"encoding,omitzero"` // Array of transformation to be applied to the overlay video. Except // `streamingResolutions`, all other video transformations are supported. See @@ -2134,6 +4827,9 @@ type VideoOverlayParam struct { } func (r VideoOverlayParam) MarshalJSON() (data []byte, err error) { - type shadow VideoOverlayParam - return param.MarshalObject(r, (*shadow)(&r)) + type shadow struct { + *VideoOverlayParam + MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field + } + return param.MarshalObject(r, shadow{&r, false}) } diff --git a/tests/helper_advanced_transformations_test.go b/tests/helper_advanced_transformations_test.go index 2d708a1..06a6cf1 100644 --- a/tests/helper_advanced_transformations_test.go +++ b/tests/helper_advanced_transformations_test.go @@ -414,6 +414,28 @@ func TestParameterSpecificTransformations(t *testing.T) { } }) + t.Run("should generate the correct URL for radius transformation with string value for per corner radius", func(t *testing.T) { + transformation := []shared.TransformationParam{ + { + Radius: shared.TransformationRadiusUnionParam{ + OfString: param.Opt[string]{Value: "10_10_max_10"}, + }, + }, + } + + url := client.Helper.BuildURL(shared.SrcOptionsParam{ + URLEndpoint: "https://ik.imagekit.io/test_url_endpoint", + TransformationPosition: shared.TransformationPositionQuery, + Src: "/test_path1.jpg", + Transformation: transformation, + }) + + expected := "https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=r-10_10_max_10" + if url != expected { + t.Errorf("Expected %s, got %s", expected, url) + } + }) + t.Run("should generate the correct URL with many transformations, including video and AI transforms", func(t *testing.T) { transformation := []shared.TransformationParam{ { @@ -502,7 +524,10 @@ func TestParameterSpecificTransformations(t *testing.T) { Gradient: shared.TransformationGradientUnionParam{ OfString: param.Opt[string]{Value: "from-red_to-white"}, }, - Original: param.Opt[bool]{Value: true}, + // New transformations + ColorReplace: param.Opt[string]{Value: "FF0000_100_0000FF"}, + Distort: param.Opt[string]{Value: "a-45"}, + Original: param.Opt[bool]{Value: true}, Page: shared.TransformationPageUnionParam{ OfString: param.Opt[string]{Value: "2_4"}, }, @@ -517,7 +542,7 @@ func TestParameterSpecificTransformations(t *testing.T) { Transformation: transformation, }) - expected := "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=w-400,h-300,q-40,ar-4-3,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,o-0.8,z-2,rt-90,bl-10,n-some_name,pr-true,lo-true,fl-h,t-5,md-true,cp-true,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-bgremove,e-contrast,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end" + expected := "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=w-400,h-300,q-40,ar-4-3,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,cr-FF0000_100_0000FF,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,o-0.8,z-2,rt-90,bl-10,n-some_name,pr-true,lo-true,fl-h,t-5,md-true,cp-true,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-bgremove,e-contrast,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,e-distort-a-45,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end" if url != expected { t.Errorf("Expected %s, got %s", expected, url) } diff --git a/tests/helper_overlay_test.go b/tests/helper_overlay_test.go index a147709..8205cfa 100644 --- a/tests/helper_overlay_test.go +++ b/tests/helper_overlay_test.go @@ -833,4 +833,116 @@ func TestOverlayEncoding(t *testing.T) { t.Errorf("Expected %s, got %s", expected, url) } }) + + t.Run("should generate URL with image overlay using layerMode multiply", func(t *testing.T) { + transformation := []shared.TransformationParam{ + { + Overlay: shared.OverlayUnionParam{ + OfImage: &shared.ImageOverlayParam{ + Input: "logo.png", + Type: constant.Image("image"), + BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeMultiply, + }, + }, + }, + }, + } + + url := client.Helper.BuildURL(shared.SrcOptionsParam{ + URLEndpoint: "https://ik.imagekit.io/test_url_endpoint", + TransformationPosition: shared.TransformationPositionPath, + Src: "/base-image.jpg", + Transformation: transformation, + }) + + expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-logo.png,lm-multiply,l-end/base-image.jpg" + if url != expected { + t.Errorf("Expected %s, got %s", expected, url) + } + }) + + t.Run("should generate URL with image overlay using layerMode cutter", func(t *testing.T) { + transformation := []shared.TransformationParam{ + { + Overlay: shared.OverlayUnionParam{ + OfImage: &shared.ImageOverlayParam{ + Input: "mask.png", + Type: constant.Image("image"), + BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeCutter, + }, + }, + }, + }, + } + + url := client.Helper.BuildURL(shared.SrcOptionsParam{ + URLEndpoint: "https://ik.imagekit.io/test_url_endpoint", + TransformationPosition: shared.TransformationPositionPath, + Src: "/base-image.jpg", + Transformation: transformation, + }) + + expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-mask.png,lm-cutter,l-end/base-image.jpg" + if url != expected { + t.Errorf("Expected %s, got %s", expected, url) + } + }) + + t.Run("should generate URL with image overlay using layerMode cutout", func(t *testing.T) { + transformation := []shared.TransformationParam{ + { + Overlay: shared.OverlayUnionParam{ + OfImage: &shared.ImageOverlayParam{ + Input: "shape.png", + Type: constant.Image("image"), + BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeCutout, + }, + }, + }, + }, + } + + url := client.Helper.BuildURL(shared.SrcOptionsParam{ + URLEndpoint: "https://ik.imagekit.io/test_url_endpoint", + TransformationPosition: shared.TransformationPositionPath, + Src: "/base-image.jpg", + Transformation: transformation, + }) + + expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-shape.png,lm-cutout,l-end/base-image.jpg" + if url != expected { + t.Errorf("Expected %s, got %s", expected, url) + } + }) + + t.Run("should generate URL with image overlay using layerMode displace", func(t *testing.T) { + transformation := []shared.TransformationParam{ + { + Overlay: shared.OverlayUnionParam{ + OfImage: &shared.ImageOverlayParam{ + Input: "displacement.png", + Type: constant.Image("image"), + BaseOverlayParam: shared.BaseOverlayParam{ + LayerMode: shared.BaseOverlayLayerModeDisplace, + }, + }, + }, + }, + } + + url := client.Helper.BuildURL(shared.SrcOptionsParam{ + URLEndpoint: "https://ik.imagekit.io/test_url_endpoint", + TransformationPosition: shared.TransformationPositionPath, + Src: "/base-image.jpg", + Transformation: transformation, + }) + + expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-displacement.png,lm-displace,l-end/base-image.jpg" + if url != expected { + t.Errorf("Expected %s, got %s", expected, url) + } + }) } diff --git a/usage_test.go b/usage_test.go index 9e38cfd..6792db9 100644 --- a/usage_test.go +++ b/usage_test.go @@ -27,6 +27,7 @@ func TestUsage(t *testing.T) { option.WithPrivateKey("My Private Key"), option.WithPassword("My Password"), ) + t.Skip("Prism tests are disabled") response, err := client.Files.Upload(context.TODO(), imagekit.FileUploadParams{ File: io.Reader(bytes.NewBuffer([]byte("https://www.example.com/public-url.jpg"))), FileName: "file-name.jpg", diff --git a/webhook.go b/webhook.go index 6984cf2..abddde8 100644 --- a/webhook.go +++ b/webhook.go @@ -612,6 +612,8 @@ type UploadPreTransformSuccessEventDataExtensionStatus struct { // Any of "success", "pending", "failed". AIAutoDescription string `json:"ai-auto-description"` // Any of "success", "pending", "failed". + AITasks string `json:"ai-tasks"` + // Any of "success", "pending", "failed". AwsAutoTagging string `json:"aws-auto-tagging"` // Any of "success", "pending", "failed". GoogleAutoTagging string `json:"google-auto-tagging"` @@ -620,6 +622,7 @@ type UploadPreTransformSuccessEventDataExtensionStatus struct { // JSON contains metadata for fields, check presence with [respjson.Field.Valid]. JSON struct { AIAutoDescription respjson.Field + AITasks respjson.Field AwsAutoTagging respjson.Field GoogleAutoTagging respjson.Field RemoveBg respjson.Field @@ -1552,13 +1555,16 @@ func (r *VideoTransformationReadyEventTimings) UnmarshalJSON(data []byte) error // [UploadPreTransformErrorEvent], [UploadPostTransformSuccessEvent], // [UploadPostTransformErrorEvent]. // +// Use the [UnsafeUnwrapWebhookEventUnion.AsAny] method to switch on the variant. +// // Use the methods beginning with 'As' to cast the union to one of its variants. type UnsafeUnwrapWebhookEventUnion struct { // This field is from variant [VideoTransformationAcceptedEvent], // [VideoTransformationReadyEvent], [VideoTransformationErrorEvent], // [UploadPreTransformSuccessEvent], [UploadPreTransformErrorEvent], // [UploadPostTransformSuccessEvent], [UploadPostTransformErrorEvent]. - ID string `json:"id"` + ID string `json:"id"` + // Any of nil, nil, nil, nil, nil, nil, nil. Type string `json:"type"` CreatedAt time.Time `json:"created_at"` // This field is a union of [VideoTransformationAcceptedEventData], @@ -1890,13 +1896,16 @@ func (r *UnsafeUnwrapWebhookEventUnionRequestTransformation) UnmarshalJSON(data // [UploadPreTransformErrorEvent], [UploadPostTransformSuccessEvent], // [UploadPostTransformErrorEvent]. // +// Use the [UnwrapWebhookEventUnion.AsAny] method to switch on the variant. +// // Use the methods beginning with 'As' to cast the union to one of its variants. type UnwrapWebhookEventUnion struct { // This field is from variant [VideoTransformationAcceptedEvent], // [VideoTransformationReadyEvent], [VideoTransformationErrorEvent], // [UploadPreTransformSuccessEvent], [UploadPreTransformErrorEvent], // [UploadPostTransformSuccessEvent], [UploadPostTransformErrorEvent]. - ID string `json:"id"` + ID string `json:"id"` + // Any of nil, nil, nil, nil, nil, nil, nil. Type string `json:"type"` CreatedAt time.Time `json:"created_at"` // This field is a union of [VideoTransformationAcceptedEventData],