|
14 | 14 | package runtime |
15 | 15 |
|
16 | 16 | import ( |
| 17 | + "bytes" |
17 | 18 | "encoding" |
| 19 | + "encoding/json" |
18 | 20 | "errors" |
19 | 21 | "fmt" |
20 | 22 | "net/url" |
@@ -222,6 +224,27 @@ func styleStruct(style string, explode bool, paramName string, paramLocation Par |
222 | 224 | return MarshalDeepObject(value, paramName) |
223 | 225 | } |
224 | 226 |
|
| 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 | + |
225 | 248 | // Otherwise, we need to build a dictionary of the struct's fields. Each |
226 | 249 | // field may only be a primitive value. |
227 | 250 | v := reflect.ValueOf(value) |
@@ -402,6 +425,28 @@ func primitiveToString(value interface{}) (string, error) { |
402 | 425 | } |
403 | 426 | case reflect.String: |
404 | 427 | 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 |
405 | 450 | default: |
406 | 451 | v, ok := value.(fmt.Stringer) |
407 | 452 | if !ok { |
|
0 commit comments