mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-12 20:50:55 +00:00
[BUG][GO] use value receiver for JSON marshal (#19962)
* chore(go): add failing test for JSON marshalling Adds a small schema (FruitJuice) which contains a required gmFruit, which inherits using AnyOf. This fails to correctly marshal as JSON. * fix(go): use non-pointer receiver for JSON marshal In the case of a required anyOf property, JSON marshalling would has been incorrect. Required properties are not nullable, and thus always use value receivers. For the single case of anyOf models, a pointer receiver was used for MarshalJSON. All other instances of json marshalling use value receivers. This change is simply to use a value receiver instead of a pointer receiver in the template for `MarshalJSON` on anyOf models. --------- Co-authored-by: Per Hallgren <perhallgren@users.noreply.github.com>
This commit is contained in:
parent
705261978d
commit
8a94fc667e
@ -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}})
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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'
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
@ -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`
|
||||
|
@ -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`
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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=
|
||||
|
@ -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}}")
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user