github.com/oam-dev/kubevela@v1.9.11/pkg/definition/gen_sdk/openapi-generator/templates/go/model_oneof.mustache (about) 1 // {{classname}} - {{{description}}}{{^description}}struct for {{{classname}}}{{/description}} 2 type {{classname}} struct { 3 {{#oneOf}} 4 {{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} *{{{.}}} 5 {{/oneOf}} 6 } 7 8 {{#composedSchemas}} 9 {{#oneOf}} 10 // {{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}As{{classname}} is is a convenience function that returns {{datatype}} wrapped in {{classname}} 11 func {{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}As{{classname}}(v *{{datatype}}) {{classname}} { 12 return {{classname}}{ 13 {{#lambda.type-to-name}}{{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}{{/lambda.type-to-name}}: v, 14 } 15 } 16 17 {{#defaultValue}} 18 // {{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}As{{classname}}OrDefault returns {{datatype}} wrapped in {{classname}} if not nil, or a default value if nil 19 func {{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}As{{classname}}OrDefault(v *{{datatype}}) {{classname}} { 20 if v == nil { 21 return {{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}As{{classname}}(utils.Ptr{{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}({{datatype}}({{defaultValue}}))) 22 } 23 return {{#lambda.type-to-name}}{{datatype}}{{/lambda.type-to-name}}As{{classname}}(v) 24 } 25 {{/defaultValue}} 26 {{/oneOf}} 27 {{/composedSchemas}} 28 29 30 // Validate validates this {{classname}} 31 func (o *{{classname}}) Validate() error{ 32 {{#oneOf}} 33 if o.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} != nil { 34 return nil 35 } 36 37 {{/oneOf}} 38 return fmt.Errorf("No oneOf schemas were matched in {{classname}}") 39 } 40 41 42 // Unmarshal JSON data into one of the pointers in the struct 43 func (dst *{{classname}}) UnmarshalJSON(data []byte) error { 44 var err error 45 {{#isNullable}} 46 // this object is nullable so check if the payload is null or empty string 47 if string(data) == "" || string(data) == "{}" { 48 return nil 49 } 50 51 {{/isNullable}} 52 {{#useOneOfDiscriminatorLookup}} 53 {{#discriminator}} 54 {{#mappedModels}} 55 {{#-first}} 56 // use discriminator value to speed up the lookup 57 var jsonDict map[string]interface{} 58 err = utils.NewStrictDecoder(data).Decode(&jsonDict) 59 if err != nil { 60 return fmt.Errorf("failed to unmarshal JSON into map for the discriminator lookup") 61 } 62 63 {{/-first}} 64 // check if the discriminator value is '{{{mappingName}}}' 65 if jsonDict["{{{propertyBaseName}}}"] == "{{{mappingName}}}" { 66 // try to unmarshal JSON data into {{{modelName}}} 67 err = json.Unmarshal(data, &dst.{{{modelName}}}) 68 if err == nil { 69 return nil // data stored in dst.{{{modelName}}}, return on the first match 70 } else { 71 dst.{{{modelName}}} = nil 72 return fmt.Errorf("failed to unmarshal {{classname}} as {{{modelName}}}: %s", err.Error()) 73 } 74 } 75 76 {{/mappedModels}} 77 return nil 78 {{/discriminator}} 79 {{^discriminator}} 80 match := 0 81 {{#oneOf}} 82 // try to unmarshal data into {{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} 83 err = json.Unmarshal(data, &dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) 84 if err == nil { 85 json{{{.}}}, _ := json.Marshal(dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) 86 if string(json{{{.}}}) == "{}" { // empty struct 87 dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} = nil 88 } else { 89 match++ 90 } 91 } else { 92 dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} = nil 93 } 94 95 {{/oneOf}} 96 if match > 1 { // more than 1 match 97 // reset to nil 98 {{#oneOf}} 99 dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} = nil 100 {{/oneOf}} 101 102 return fmt.Errorf("data matches more than one schema in oneOf({{classname}})") 103 } else if match == 1 { 104 return nil // exactly one match 105 } else { // no match 106 return fmt.Errorf("data failed to match schemas in oneOf({{classname}})") 107 } 108 {{/discriminator}} 109 {{/useOneOfDiscriminatorLookup}} 110 {{^useOneOfDiscriminatorLookup}} 111 match := 0 112 {{#oneOf}} 113 // try to unmarshal data into {{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} 114 err = utils.NewStrictDecoder(data).Decode(&dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) 115 if err == nil { 116 json{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}, _ := json.Marshal(dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) 117 if string(json{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) == "{}" { // empty struct 118 dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} = nil 119 } else { 120 match++ 121 } 122 } else { 123 dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} = nil 124 } 125 126 {{/oneOf}} 127 if match > 1 { // more than 1 match 128 // reset to nil 129 {{#oneOf}} 130 dst.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} = nil 131 {{/oneOf}} 132 133 return fmt.Errorf("data matches more than one schema in oneOf({{classname}})") 134 } else if match == 1 { 135 return nil // exactly one match 136 } else { // no match 137 return fmt.Errorf("data failed to match schemas in oneOf({{classname}})") 138 } 139 {{/useOneOfDiscriminatorLookup}} 140 } 141 142 // Marshal data from the first non-nil pointers in the struct to JSON 143 func (src {{classname}}) MarshalJSON() ([]byte, error) { 144 {{#oneOf}} 145 if src.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} != nil { 146 return json.Marshal(&src.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) 147 } 148 149 {{/oneOf}} 150 return nil, nil // no data in oneOf schemas 151 } 152 153 // Get the actual instance 154 func (obj *{{classname}}) GetActualInstance() (interface{}) { 155 if obj == nil { 156 return nil 157 } 158 {{#oneOf}} 159 if obj.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} != nil { 160 return obj.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} 161 } 162 163 {{/oneOf}} 164 // all schemas are nil 165 return nil 166 } 167 168 {{>nullable_model}}