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}}