@@ -93,3 +93,45 @@ func NewTranslator(crd *apiextensionsv1.CustomResourceDefinition, crdVersion str
9393 mappingSchema : & openapi3.SchemaRef {Value : & mappingSchema },
9494 }, nil
9595}
96+
97+ // NewPerVersionTranslators creates a set of translators indexed by SDK versions
98+ //
99+ // Given the following example resource:
100+ //
101+ // apiVersion: atlas.generated.mongodb.com/v1
102+ // kind: SearchIndex
103+ // metadata:
104+ // name: search-index
105+ // spec:
106+ // v20250312:
107+ // ...
108+ // v20250810:
109+ //
110+ // In the above case crdVersion is "v1" and versions can be "v20250312"
111+ // and/or "v20250810".
112+ func NewPerVersionTranslators (crd * apiextensionsv1.CustomResourceDefinition , crdVersion string , versions ... string ) (map [string ]Translator , error ) {
113+ translators := map [string ]Translator {}
114+ specVersion := crds .SelectVersion (& crd .Spec , crdVersion )
115+ for _ , version := range versions {
116+ if err := crds .AssertMajorVersion (specVersion , crd .Spec .Names .Kind , version ); err != nil {
117+ return nil , fmt .Errorf ("failed to assert major version %s in CRD: %w" , version , err )
118+ }
119+ var mappingSchema openapi3.Schema
120+ mappingString , ok := crd .Annotations ["api-mappings" ]
121+ if ok && mappingString != "" {
122+ jsonBytes , err := yaml .YAMLToJSON ([]byte (mappingString ))
123+ if err != nil {
124+ return nil , fmt .Errorf ("failed to convert 'api-mappings' YAML to JSON: %w" , err )
125+ }
126+ if err := json .Unmarshal (jsonBytes , & mappingSchema ); err != nil {
127+ return nil , fmt .Errorf ("failed to unmarshal 'api-mappings' JSON into schema: %w" , err )
128+ }
129+ }
130+
131+ translators [version ] = & translator {
132+ majorVersion : version ,
133+ mappingSchema : & openapi3.SchemaRef {Value : & mappingSchema },
134+ }
135+ }
136+ return translators , nil
137+ }
0 commit comments