Skip to content

Commit eb22ac3

Browse files
authored
Fix styling AnyOf issue (#809)
1 parent 4ed6ff9 commit eb22ac3

1 file changed

Lines changed: 45 additions & 0 deletions

File tree

styleparam.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
package runtime
1515

1616
import (
17+
"bytes"
1718
"encoding"
19+
"encoding/json"
1820
"errors"
1921
"fmt"
2022
"net/url"
@@ -222,6 +224,27 @@ func styleStruct(style string, explode bool, paramName string, paramLocation Par
222224
return MarshalDeepObject(value, paramName)
223225
}
224226

227+
// If input has Marshaler, such as object has Additional Property or AnyOf,
228+
// We use this Marshaler and convert into interface{} before styling.
229+
if m, ok := value.(json.Marshaler); ok {
230+
buf, err := m.MarshalJSON()
231+
if err != nil {
232+
return "", fmt.Errorf("failed to marshal input to JSON: %w", err)
233+
}
234+
e := json.NewDecoder(bytes.NewReader(buf))
235+
e.UseNumber()
236+
var i2 interface{}
237+
err = e.Decode(&i2)
238+
if err != nil {
239+
return "", fmt.Errorf("failed to unmarshal JSON: %w", err)
240+
}
241+
s, err := StyleParamWithLocation(style, explode, paramName, paramLocation, i2)
242+
if err != nil {
243+
return "", fmt.Errorf("error style JSON structure: %w", err)
244+
}
245+
return s, nil
246+
}
247+
225248
// Otherwise, we need to build a dictionary of the struct's fields. Each
226249
// field may only be a primitive value.
227250
v := reflect.ValueOf(value)
@@ -402,6 +425,28 @@ func primitiveToString(value interface{}) (string, error) {
402425
}
403426
case reflect.String:
404427
output = v.String()
428+
case reflect.Struct:
429+
// If input has Marshaler, such as object has Additional Property or AnyOf,
430+
// We use this Marshaler and convert into interface{} before styling.
431+
if m, ok := value.(json.Marshaler); ok {
432+
buf, err := m.MarshalJSON()
433+
if err != nil {
434+
return "", fmt.Errorf("failed to marshal input to JSON: %w", err)
435+
}
436+
e := json.NewDecoder(bytes.NewReader(buf))
437+
e.UseNumber()
438+
var i2 interface{}
439+
err = e.Decode(&i2)
440+
if err != nil {
441+
return "", fmt.Errorf("failed to unmarshal JSON: %w", err)
442+
}
443+
output, err = primitiveToString(i2)
444+
if err != nil {
445+
return "", fmt.Errorf("error convert JSON structure: %w", err)
446+
}
447+
break
448+
}
449+
fallthrough
405450
default:
406451
v, ok := value.(fmt.Stringer)
407452
if !ok {

0 commit comments

Comments
 (0)