diff --git a/modules/openapi-generator/src/main/resources/go/model_anyof.mustache b/modules/openapi-generator/src/main/resources/go/model_anyof.mustache index 5e2d57aad107..21e33137403a 100644 --- a/modules/openapi-generator/src/main/resources/go/model_anyof.mustache +++ b/modules/openapi-generator/src/main/resources/go/model_anyof.mustache @@ -68,7 +68,7 @@ func (dst *{{classname}}) UnmarshalJSON(data []byte) error { } // Marshal data from the first non-nil pointers in the struct to JSON -func (src *{{classname}}) MarshalJSON() ([]byte, error) { +func (src {{classname}}) MarshalJSON() ([]byte, error) { {{#anyOf}} if src.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}} != nil { return json.Marshal(&src.{{#lambda.type-to-name}}{{{.}}}{{/lambda.type-to-name}}) diff --git a/modules/openapi-generator/src/test/resources/3_0/go/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml b/modules/openapi-generator/src/test/resources/3_0/go/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml index f02e8d9e6c2b..faed76ea4927 100644 --- a/modules/openapi-generator/src/test/resources/3_0/go/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/go/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml @@ -1394,11 +1394,6 @@ components: FilterTypeRegex: type: object properties: - type: - enum: - - set - - range - type: string regex: type: string required: @@ -1406,11 +1401,6 @@ components: FilterTypeRange: type: object properties: - type: - enum: - - set - - range - type: string data: type: array items: @@ -1425,7 +1415,16 @@ components: mapping: set: '#/components/schemas/FilterTypeRegex' range: '#/components/schemas/FilterTypeRange' - propertyName: type + propertyName: type + properties: + type: + enum: + - set + - range + type: string + date: + type: string + format: date-time MapWithDateTime: type: object additionalProperties: @@ -2119,6 +2118,13 @@ components: type: string required: - className + fruitJuice: + type: object + required: + - fruit + properties: + fruit: + $ref: '#/components/schemas/gmFruit' gmFruit: properties: color: diff --git a/samples/client/others/go/oneof-anyof-required/model_object2.go b/samples/client/others/go/oneof-anyof-required/model_object2.go index ee4ff5ec523e..462b5429f900 100644 --- a/samples/client/others/go/oneof-anyof-required/model_object2.go +++ b/samples/client/others/go/oneof-anyof-required/model_object2.go @@ -55,7 +55,7 @@ func (dst *Object2) UnmarshalJSON(data []byte) error { } // Marshal data from the first non-nil pointers in the struct to JSON -func (src *Object2) MarshalJSON() ([]byte, error) { +func (src Object2) MarshalJSON() ([]byte, error) { if src.NestedObject1 != nil { return json.Marshal(&src.NestedObject1) } diff --git a/samples/openapi3/client/petstore/go/go-petstore/.openapi-generator/FILES b/samples/openapi3/client/petstore/go/go-petstore/.openapi-generator/FILES index 78d7498ae37b..e6cac5bc3f30 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/.openapi-generator/FILES +++ b/samples/openapi3/client/petstore/go/go-petstore/.openapi-generator/FILES @@ -47,6 +47,7 @@ docs/Foo.md docs/FooGetDefaultResponse.md docs/FormatTest.md docs/Fruit.md +docs/FruitJuice.md docs/FruitReq.md docs/GmFruit.md docs/HasOnlyReadOnly.md @@ -126,6 +127,7 @@ model_filter_type_regex.go model_foo.go model_format_test_.go model_fruit.go +model_fruit_juice.go model_fruit_req.go model_gm_fruit.go model_has_only_read_only.go diff --git a/samples/openapi3/client/petstore/go/go-petstore/README.md b/samples/openapi3/client/petstore/go/go-petstore/README.md index f0702f101662..fb2ca8eea3a4 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/README.md +++ b/samples/openapi3/client/petstore/go/go-petstore/README.md @@ -161,6 +161,7 @@ Class | Method | HTTP request | Description - [FooGetDefaultResponse](docs/FooGetDefaultResponse.md) - [FormatTest](docs/FormatTest.md) - [Fruit](docs/Fruit.md) + - [FruitJuice](docs/FruitJuice.md) - [FruitReq](docs/FruitReq.md) - [GmFruit](docs/GmFruit.md) - [HasOnlyReadOnly](docs/HasOnlyReadOnly.md) diff --git a/samples/openapi3/client/petstore/go/go-petstore/api/openapi.yaml b/samples/openapi3/client/petstore/go/go-petstore/api/openapi.yaml index 3a8b28a21ae9..580a6c45a238 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/api/openapi.yaml +++ b/samples/openapi3/client/petstore/go/go-petstore/api/openapi.yaml @@ -1296,11 +1296,6 @@ components: schemas: FilterTypeRegex: properties: - type: - enum: - - set - - range - type: string regex: type: string required: @@ -1308,11 +1303,6 @@ components: type: object FilterTypeRange: properties: - type: - enum: - - set - - range - type: string data: items: type: string @@ -1329,6 +1319,15 @@ components: set: '#/components/schemas/FilterTypeRegex' range: '#/components/schemas/FilterTypeRange' propertyName: type + properties: + type: + enum: + - set + - range + type: string + date: + format: date-time + type: string MapWithDateTime: additionalProperties: items: @@ -2101,6 +2100,13 @@ components: required: - className type: object + fruitJuice: + properties: + fruit: + $ref: '#/components/schemas/gmFruit' + required: + - fruit + type: object gmFruit: anyOf: - $ref: '#/components/schemas/apple' diff --git a/samples/openapi3/client/petstore/go/go-petstore/docs/FakeAPI.md b/samples/openapi3/client/petstore/go/go-petstore/docs/FakeAPI.md index 5a6d632f7c40..f533a395e2fa 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/docs/FakeAPI.md +++ b/samples/openapi3/client/petstore/go/go-petstore/docs/FakeAPI.md @@ -1197,7 +1197,7 @@ import ( ) func main() { - filter := *openapiclient.NewFilterAny("Type_example") // FilterAny | (optional) + filter := *openapiclient.NewFilterAny() // FilterAny | (optional) configuration := openapiclient.NewConfiguration() apiClient := openapiclient.NewAPIClient(configuration) diff --git a/samples/openapi3/client/petstore/go/go-petstore/docs/FilterAny.md b/samples/openapi3/client/petstore/go/go-petstore/docs/FilterAny.md index beada8f60c06..350b5e261217 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/docs/FilterAny.md +++ b/samples/openapi3/client/petstore/go/go-petstore/docs/FilterAny.md @@ -4,7 +4,8 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Type** | **string** | | +**Type** | Pointer to **string** | | [optional] +**Date** | Pointer to **time.Time** | | [optional] **Regex** | Pointer to **string** | | [optional] **Data** | Pointer to **[]string** | | [optional] @@ -12,7 +13,7 @@ Name | Type | Description | Notes ### NewFilterAny -`func NewFilterAny(type_ string, ) *FilterAny` +`func NewFilterAny() *FilterAny` NewFilterAny instantiates a new FilterAny object This constructor will assign default values to properties that have it defined, @@ -46,6 +47,36 @@ and a boolean to check if the value has been set. SetType sets Type field to given value. +### HasType + +`func (o *FilterAny) HasType() bool` + +HasType returns a boolean if a field has been set. + +### GetDate + +`func (o *FilterAny) GetDate() time.Time` + +GetDate returns the Date field if non-nil, zero value otherwise. + +### GetDateOk + +`func (o *FilterAny) GetDateOk() (*time.Time, bool)` + +GetDateOk returns a tuple with the Date field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetDate + +`func (o *FilterAny) SetDate(v time.Time)` + +SetDate sets Date field to given value. + +### HasDate + +`func (o *FilterAny) HasDate() bool` + +HasDate returns a boolean if a field has been set. ### GetRegex diff --git a/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRange.md b/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRange.md index 436cb910496c..41e657a60169 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRange.md +++ b/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRange.md @@ -4,14 +4,13 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Type** | **string** | | **Data** | Pointer to **[]string** | | [optional] ## Methods ### NewFilterTypeRange -`func NewFilterTypeRange(type_ string, ) *FilterTypeRange` +`func NewFilterTypeRange() *FilterTypeRange` NewFilterTypeRange instantiates a new FilterTypeRange object This constructor will assign default values to properties that have it defined, @@ -26,26 +25,6 @@ NewFilterTypeRangeWithDefaults instantiates a new FilterTypeRange object This constructor will only assign default values to properties that have it defined, but it doesn't guarantee that properties required by API are set -### GetType - -`func (o *FilterTypeRange) GetType() string` - -GetType returns the Type field if non-nil, zero value otherwise. - -### GetTypeOk - -`func (o *FilterTypeRange) GetTypeOk() (*string, bool)` - -GetTypeOk returns a tuple with the Type field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetType - -`func (o *FilterTypeRange) SetType(v string)` - -SetType sets Type field to given value. - - ### GetData `func (o *FilterTypeRange) GetData() []string` diff --git a/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRegex.md b/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRegex.md index e11048f19aa9..96946b3f56d2 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRegex.md +++ b/samples/openapi3/client/petstore/go/go-petstore/docs/FilterTypeRegex.md @@ -4,14 +4,13 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**Type** | **string** | | **Regex** | Pointer to **string** | | [optional] ## Methods ### NewFilterTypeRegex -`func NewFilterTypeRegex(type_ string, ) *FilterTypeRegex` +`func NewFilterTypeRegex() *FilterTypeRegex` NewFilterTypeRegex instantiates a new FilterTypeRegex object This constructor will assign default values to properties that have it defined, @@ -26,26 +25,6 @@ NewFilterTypeRegexWithDefaults instantiates a new FilterTypeRegex object This constructor will only assign default values to properties that have it defined, but it doesn't guarantee that properties required by API are set -### GetType - -`func (o *FilterTypeRegex) GetType() string` - -GetType returns the Type field if non-nil, zero value otherwise. - -### GetTypeOk - -`func (o *FilterTypeRegex) GetTypeOk() (*string, bool)` - -GetTypeOk returns a tuple with the Type field if it's non-nil, zero value otherwise -and a boolean to check if the value has been set. - -### SetType - -`func (o *FilterTypeRegex) SetType(v string)` - -SetType sets Type field to given value. - - ### GetRegex `func (o *FilterTypeRegex) GetRegex() string` diff --git a/samples/openapi3/client/petstore/go/go-petstore/docs/FruitJuice.md b/samples/openapi3/client/petstore/go/go-petstore/docs/FruitJuice.md new file mode 100644 index 000000000000..fe9d41d74705 --- /dev/null +++ b/samples/openapi3/client/petstore/go/go-petstore/docs/FruitJuice.md @@ -0,0 +1,51 @@ +# FruitJuice + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**Fruit** | [**GmFruit**](GmFruit.md) | | + +## Methods + +### NewFruitJuice + +`func NewFruitJuice(fruit GmFruit, ) *FruitJuice` + +NewFruitJuice instantiates a new FruitJuice object +This constructor will assign default values to properties that have it defined, +and makes sure properties required by API are set, but the set of arguments +will change when the set of required properties is changed + +### NewFruitJuiceWithDefaults + +`func NewFruitJuiceWithDefaults() *FruitJuice` + +NewFruitJuiceWithDefaults instantiates a new FruitJuice object +This constructor will only assign default values to properties that have it defined, +but it doesn't guarantee that properties required by API are set + +### GetFruit + +`func (o *FruitJuice) GetFruit() GmFruit` + +GetFruit returns the Fruit field if non-nil, zero value otherwise. + +### GetFruitOk + +`func (o *FruitJuice) GetFruitOk() (*GmFruit, bool)` + +GetFruitOk returns a tuple with the Fruit field if it's non-nil, zero value otherwise +and a boolean to check if the value has been set. + +### SetFruit + +`func (o *FruitJuice) SetFruit(v GmFruit)` + +SetFruit sets Fruit field to given value. + + + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/samples/openapi3/client/petstore/go/go-petstore/model_any_of_primitive_type.go b/samples/openapi3/client/petstore/go/go-petstore/model_any_of_primitive_type.go index c18a0c8a2153..81a52e465acf 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/model_any_of_primitive_type.go +++ b/samples/openapi3/client/petstore/go/go-petstore/model_any_of_primitive_type.go @@ -69,7 +69,7 @@ func (dst *AnyOfPrimitiveType) UnmarshalJSON(data []byte) error { } // Marshal data from the first non-nil pointers in the struct to JSON -func (src *AnyOfPrimitiveType) MarshalJSON() ([]byte, error) { +func (src AnyOfPrimitiveType) MarshalJSON() ([]byte, error) { if src.OneOfPrimitiveTypeChild != nil { return json.Marshal(&src.OneOfPrimitiveTypeChild) } diff --git a/samples/openapi3/client/petstore/go/go-petstore/model_filter_any.go b/samples/openapi3/client/petstore/go/go-petstore/model_filter_any.go index f2785ce45ee0..8c1cb3803664 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/model_filter_any.go +++ b/samples/openapi3/client/petstore/go/go-petstore/model_filter_any.go @@ -128,7 +128,7 @@ func (dst *FilterAny) UnmarshalJSON(data []byte) error { } // Marshal data from the first non-nil pointers in the struct to JSON -func (src *FilterAny) MarshalJSON() ([]byte, error) { +func (src FilterAny) MarshalJSON() ([]byte, error) { if src.FilterTypeRange != nil { return json.Marshal(&src.FilterTypeRange) } diff --git a/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_range.go b/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_range.go index cfb9c006444c..fb7eeebbcaae 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_range.go +++ b/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_range.go @@ -12,7 +12,6 @@ package petstore import ( "encoding/json" - "fmt" ) // checks if the FilterTypeRange type satisfies the MappedNullable interface at compile time @@ -20,7 +19,6 @@ var _ MappedNullable = &FilterTypeRange{} // FilterTypeRange struct for FilterTypeRange type FilterTypeRange struct { - Type string `json:"type"` Data []string `json:"data,omitempty"` AdditionalProperties map[string]interface{} } @@ -31,9 +29,8 @@ type _FilterTypeRange FilterTypeRange // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewFilterTypeRange(type_ string) *FilterTypeRange { +func NewFilterTypeRange() *FilterTypeRange { this := FilterTypeRange{} - this.Type = type_ return &this } @@ -45,31 +42,6 @@ func NewFilterTypeRangeWithDefaults() *FilterTypeRange { return &this } -// GetType returns the Type field value -func (o *FilterTypeRange) GetType() string { - if o == nil { - var ret string - return ret - } - - return o.Type -} - -// GetTypeOk returns a tuple with the Type field value -// and a boolean to check if the value has been set. -func (o *FilterTypeRange) GetTypeOk() (*string, bool) { - if o == nil { - return nil, false - } - return &o.Type, true -} - -// SetType sets field value -func (o *FilterTypeRange) SetType(v string) { - o.Type = v -} - - // GetData returns the Data field value if set, zero value otherwise. func (o *FilterTypeRange) GetData() []string { if o == nil || IsNil(o.Data) { @@ -112,7 +84,6 @@ func (o FilterTypeRange) MarshalJSON() ([]byte, error) { func (o FilterTypeRange) ToMap() (map[string]interface{}, error) { toSerialize := map[string]interface{}{} - toSerialize["type"] = o.Type if !IsNil(o.Data) { toSerialize["data"] = o.Data } @@ -125,44 +96,6 @@ func (o FilterTypeRange) ToMap() (map[string]interface{}, error) { } func (o *FilterTypeRange) UnmarshalJSON(data []byte) (err error) { - // This validates that all required properties are included in the JSON object - // by unmarshalling the object into a generic map with string keys and checking - // that every required field exists as a key in the generic map. - requiredProperties := []string{ - "type", - } - - // defaultValueFuncMap captures the default values for required properties. - // These values are used when required properties are missing from the payload. - defaultValueFuncMap := map[string]func() interface{} { - } - var defaultValueApplied bool - allProperties := make(map[string]interface{}) - - err = json.Unmarshal(data, &allProperties) - - if err != nil { - return err; - } - - for _, requiredProperty := range(requiredProperties) { - if value, exists := allProperties[requiredProperty]; !exists || value == "" { - if _, ok := defaultValueFuncMap[requiredProperty]; ok { - allProperties[requiredProperty] = defaultValueFuncMap[requiredProperty]() - defaultValueApplied = true - } - } - if value, exists := allProperties[requiredProperty]; !exists || value == ""{ - return fmt.Errorf("no value given for required property %v", requiredProperty) - } - } - - if defaultValueApplied { - data, err = json.Marshal(allProperties) - if err != nil{ - return err - } - } varFilterTypeRange := _FilterTypeRange{} err = json.Unmarshal(data, &varFilterTypeRange) @@ -176,7 +109,6 @@ func (o *FilterTypeRange) UnmarshalJSON(data []byte) (err error) { additionalProperties := make(map[string]interface{}) if err = json.Unmarshal(data, &additionalProperties); err == nil { - delete(additionalProperties, "type") delete(additionalProperties, "data") o.AdditionalProperties = additionalProperties } diff --git a/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_regex.go b/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_regex.go index 7ee6c5013cb2..c38d1bfdd0de 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_regex.go +++ b/samples/openapi3/client/petstore/go/go-petstore/model_filter_type_regex.go @@ -12,7 +12,6 @@ package petstore import ( "encoding/json" - "fmt" ) // checks if the FilterTypeRegex type satisfies the MappedNullable interface at compile time @@ -20,7 +19,6 @@ var _ MappedNullable = &FilterTypeRegex{} // FilterTypeRegex struct for FilterTypeRegex type FilterTypeRegex struct { - Type string `json:"type"` Regex *string `json:"regex,omitempty"` AdditionalProperties map[string]interface{} } @@ -31,9 +29,8 @@ type _FilterTypeRegex FilterTypeRegex // This constructor will assign default values to properties that have it defined, // and makes sure properties required by API are set, but the set of arguments // will change when the set of required properties is changed -func NewFilterTypeRegex(type_ string) *FilterTypeRegex { +func NewFilterTypeRegex() *FilterTypeRegex { this := FilterTypeRegex{} - this.Type = type_ return &this } @@ -45,31 +42,6 @@ func NewFilterTypeRegexWithDefaults() *FilterTypeRegex { return &this } -// GetType returns the Type field value -func (o *FilterTypeRegex) GetType() string { - if o == nil { - var ret string - return ret - } - - return o.Type -} - -// GetTypeOk returns a tuple with the Type field value -// and a boolean to check if the value has been set. -func (o *FilterTypeRegex) GetTypeOk() (*string, bool) { - if o == nil { - return nil, false - } - return &o.Type, true -} - -// SetType sets field value -func (o *FilterTypeRegex) SetType(v string) { - o.Type = v -} - - // GetRegex returns the Regex field value if set, zero value otherwise. func (o *FilterTypeRegex) GetRegex() string { if o == nil || IsNil(o.Regex) { @@ -112,7 +84,6 @@ func (o FilterTypeRegex) MarshalJSON() ([]byte, error) { func (o FilterTypeRegex) ToMap() (map[string]interface{}, error) { toSerialize := map[string]interface{}{} - toSerialize["type"] = o.Type if !IsNil(o.Regex) { toSerialize["regex"] = o.Regex } @@ -125,44 +96,6 @@ func (o FilterTypeRegex) ToMap() (map[string]interface{}, error) { } func (o *FilterTypeRegex) UnmarshalJSON(data []byte) (err error) { - // This validates that all required properties are included in the JSON object - // by unmarshalling the object into a generic map with string keys and checking - // that every required field exists as a key in the generic map. - requiredProperties := []string{ - "type", - } - - // defaultValueFuncMap captures the default values for required properties. - // These values are used when required properties are missing from the payload. - defaultValueFuncMap := map[string]func() interface{} { - } - var defaultValueApplied bool - allProperties := make(map[string]interface{}) - - err = json.Unmarshal(data, &allProperties) - - if err != nil { - return err; - } - - for _, requiredProperty := range(requiredProperties) { - if value, exists := allProperties[requiredProperty]; !exists || value == "" { - if _, ok := defaultValueFuncMap[requiredProperty]; ok { - allProperties[requiredProperty] = defaultValueFuncMap[requiredProperty]() - defaultValueApplied = true - } - } - if value, exists := allProperties[requiredProperty]; !exists || value == ""{ - return fmt.Errorf("no value given for required property %v", requiredProperty) - } - } - - if defaultValueApplied { - data, err = json.Marshal(allProperties) - if err != nil{ - return err - } - } varFilterTypeRegex := _FilterTypeRegex{} err = json.Unmarshal(data, &varFilterTypeRegex) @@ -176,7 +109,6 @@ func (o *FilterTypeRegex) UnmarshalJSON(data []byte) (err error) { additionalProperties := make(map[string]interface{}) if err = json.Unmarshal(data, &additionalProperties); err == nil { - delete(additionalProperties, "type") delete(additionalProperties, "regex") o.AdditionalProperties = additionalProperties } diff --git a/samples/openapi3/client/petstore/go/go-petstore/model_fruit_juice.go b/samples/openapi3/client/petstore/go/go-petstore/model_fruit_juice.go new file mode 100644 index 000000000000..972b53f000e5 --- /dev/null +++ b/samples/openapi3/client/petstore/go/go-petstore/model_fruit_juice.go @@ -0,0 +1,186 @@ +/* +OpenAPI Petstore + +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ + +API version: 1.0.0 +*/ + +// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT. + +package petstore + +import ( + "encoding/json" + "fmt" +) + +// checks if the FruitJuice type satisfies the MappedNullable interface at compile time +var _ MappedNullable = &FruitJuice{} + +// FruitJuice struct for FruitJuice +type FruitJuice struct { + Fruit GmFruit `json:"fruit"` + AdditionalProperties map[string]interface{} +} + +type _FruitJuice FruitJuice + +// NewFruitJuice instantiates a new FruitJuice object +// This constructor will assign default values to properties that have it defined, +// and makes sure properties required by API are set, but the set of arguments +// will change when the set of required properties is changed +func NewFruitJuice(fruit GmFruit) *FruitJuice { + this := FruitJuice{} + this.Fruit = fruit + return &this +} + +// NewFruitJuiceWithDefaults instantiates a new FruitJuice object +// This constructor will only assign default values to properties that have it defined, +// but it doesn't guarantee that properties required by API are set +func NewFruitJuiceWithDefaults() *FruitJuice { + this := FruitJuice{} + return &this +} + +// GetFruit returns the Fruit field value +func (o *FruitJuice) GetFruit() GmFruit { + if o == nil { + var ret GmFruit + return ret + } + + return o.Fruit +} + +// GetFruitOk returns a tuple with the Fruit field value +// and a boolean to check if the value has been set. +func (o *FruitJuice) GetFruitOk() (*GmFruit, bool) { + if o == nil { + return nil, false + } + return &o.Fruit, true +} + +// SetFruit sets field value +func (o *FruitJuice) SetFruit(v GmFruit) { + o.Fruit = v +} + + +func (o FruitJuice) MarshalJSON() ([]byte, error) { + toSerialize,err := o.ToMap() + if err != nil { + return []byte{}, err + } + return json.Marshal(toSerialize) +} + +func (o FruitJuice) ToMap() (map[string]interface{}, error) { + toSerialize := map[string]interface{}{} + toSerialize["fruit"] = o.Fruit + + for key, value := range o.AdditionalProperties { + toSerialize[key] = value + } + + return toSerialize, nil +} + +func (o *FruitJuice) UnmarshalJSON(data []byte) (err error) { + // This validates that all required properties are included in the JSON object + // by unmarshalling the object into a generic map with string keys and checking + // that every required field exists as a key in the generic map. + requiredProperties := []string{ + "fruit", + } + + // defaultValueFuncMap captures the default values for required properties. + // These values are used when required properties are missing from the payload. + defaultValueFuncMap := map[string]func() interface{} { + } + var defaultValueApplied bool + allProperties := make(map[string]interface{}) + + err = json.Unmarshal(data, &allProperties) + + if err != nil { + return err; + } + + for _, requiredProperty := range(requiredProperties) { + if value, exists := allProperties[requiredProperty]; !exists || value == "" { + if _, ok := defaultValueFuncMap[requiredProperty]; ok { + allProperties[requiredProperty] = defaultValueFuncMap[requiredProperty]() + defaultValueApplied = true + } + } + if value, exists := allProperties[requiredProperty]; !exists || value == ""{ + return fmt.Errorf("no value given for required property %v", requiredProperty) + } + } + + if defaultValueApplied { + data, err = json.Marshal(allProperties) + if err != nil{ + return err + } + } + varFruitJuice := _FruitJuice{} + + err = json.Unmarshal(data, &varFruitJuice) + + if err != nil { + return err + } + + *o = FruitJuice(varFruitJuice) + + additionalProperties := make(map[string]interface{}) + + if err = json.Unmarshal(data, &additionalProperties); err == nil { + delete(additionalProperties, "fruit") + o.AdditionalProperties = additionalProperties + } + + return err +} + +type NullableFruitJuice struct { + value *FruitJuice + isSet bool +} + +func (v NullableFruitJuice) Get() *FruitJuice { + return v.value +} + +func (v *NullableFruitJuice) Set(val *FruitJuice) { + v.value = val + v.isSet = true +} + +func (v NullableFruitJuice) IsSet() bool { + return v.isSet +} + +func (v *NullableFruitJuice) Unset() { + v.value = nil + v.isSet = false +} + +func NewNullableFruitJuice(val *FruitJuice) *NullableFruitJuice { + return &NullableFruitJuice{value: val, isSet: true} +} + +func (v NullableFruitJuice) MarshalJSON() ([]byte, error) { + return json.Marshal(v.value) +} + +func (v *NullableFruitJuice) UnmarshalJSON(src []byte) error { + v.isSet = true + return json.Unmarshal(src, &v.value) +} + + diff --git a/samples/openapi3/client/petstore/go/go-petstore/model_gm_fruit.go b/samples/openapi3/client/petstore/go/go-petstore/model_gm_fruit.go index 59c6cbea0d1b..8823193a061b 100644 --- a/samples/openapi3/client/petstore/go/go-petstore/model_gm_fruit.go +++ b/samples/openapi3/client/petstore/go/go-petstore/model_gm_fruit.go @@ -55,7 +55,7 @@ func (dst *GmFruit) UnmarshalJSON(data []byte) error { } // Marshal data from the first non-nil pointers in the struct to JSON -func (src *GmFruit) MarshalJSON() ([]byte, error) { +func (src GmFruit) MarshalJSON() ([]byte, error) { if src.Apple != nil { return json.Marshal(&src.Apple) } diff --git a/samples/openapi3/client/petstore/go/go.mod b/samples/openapi3/client/petstore/go/go.mod index 6f5244096148..98cece85532f 100644 --- a/samples/openapi3/client/petstore/go/go.mod +++ b/samples/openapi3/client/petstore/go/go.mod @@ -6,10 +6,10 @@ replace go-petstore => ./go-petstore require ( cloud.google.com/go/compute v1.20.1 // indirect - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 go-petstore v0.0.0-00010101000000-000000000000 - golang.org/x/net v0.27.0 // indirect - golang.org/x/oauth2 v0.21.0 + golang.org/x/net v0.31.0 // indirect + golang.org/x/oauth2 v0.24.0 google.golang.org/protobuf v1.31.0 // indirect gopkg.in/validator.v2 v2.0.1 // indirect ) diff --git a/samples/openapi3/client/petstore/go/go.sum b/samples/openapi3/client/petstore/go/go.sum index 3dda4241110b..857525aa9d07 100644 --- a/samples/openapi3/client/petstore/go/go.sum +++ b/samples/openapi3/client/petstore/go/go.sum @@ -859,6 +859,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -898,6 +900,7 @@ golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1m golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1040,6 +1043,8 @@ golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1087,6 +1092,8 @@ golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1107,6 +1114,7 @@ golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1192,6 +1200,7 @@ golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1209,6 +1218,7 @@ golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1230,6 +1240,7 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/samples/openapi3/client/petstore/go/model_test.go b/samples/openapi3/client/petstore/go/model_test.go index cc6eabbeaa0a..fe4dde50935e 100644 --- a/samples/openapi3/client/petstore/go/model_test.go +++ b/samples/openapi3/client/petstore/go/model_test.go @@ -1,7 +1,9 @@ package main import ( + "bytes" "encoding/json" + "strings" "testing" sw "go-petstore" @@ -63,3 +65,19 @@ func TestRequiredFieldsAreValidated(t *testing.T) { assert.ErrorContains(err, expected, "Pet should return error when missing required fields") } + +func TestRequiredAnyOfMarshalling(t *testing.T) { + // Given + bodyBuf := &bytes.Buffer{} + bananaLengthCm := float32(23.4) + req := &sw.FruitJuice{Fruit: sw.GmFruit{ + Banana: &sw.Banana{LengthCm: &bananaLengthCm}, + }} + + // When + err := json.NewEncoder(bodyBuf).Encode(req) + + // Then + assert.Nil(t, err) + assert.Equal(t, strings.TrimSpace(bodyBuf.String()), "{\"fruit\":{\"lengthCm\":23.4}}") +}