From 2cf12623730af3279433e8bd0bd97a43c457cccf Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 2 Jun 2024 03:56:09 -0700 Subject: [PATCH] openapi{2,3}: surface both json/yaml unmarshal errors (#950) --- openapi2/marsh.go | 16 ++++++++++++---- openapi3/marsh.go | 16 ++++++++++++---- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/openapi2/marsh.go b/openapi2/marsh.go index b15f3b82c..5aa162a72 100644 --- a/openapi2/marsh.go +++ b/openapi2/marsh.go @@ -17,10 +17,18 @@ func unmarshalError(jsonUnmarshalErr error) error { } func unmarshal(data []byte, v interface{}) error { + var jsonErr, yamlErr error + // See https://github.com/getkin/kin-openapi/issues/680 - if err := json.Unmarshal(data, v); err != nil { - // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys - return yaml.Unmarshal(data, v) + if jsonErr = json.Unmarshal(data, v); jsonErr == nil { + return nil + } + + // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys + if yamlErr = yaml.Unmarshal(data, v); yamlErr == nil { + return nil } - return nil + + // If both unmarshaling attempts fail, return a new error that includes both errors + return fmt.Errorf("failed to unmarshal data: json error: %v, yaml error: %v", jsonErr, yamlErr) } diff --git a/openapi3/marsh.go b/openapi3/marsh.go index 18036ae78..9be7bb44c 100644 --- a/openapi3/marsh.go +++ b/openapi3/marsh.go @@ -17,10 +17,18 @@ func unmarshalError(jsonUnmarshalErr error) error { } func unmarshal(data []byte, v interface{}) error { + var jsonErr, yamlErr error + // See https://github.com/getkin/kin-openapi/issues/680 - if err := json.Unmarshal(data, v); err != nil { - // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys - return yaml.Unmarshal(data, v) + if jsonErr = json.Unmarshal(data, v); jsonErr == nil { + return nil + } + + // UnmarshalStrict(data, v) TODO: investigate how ymlv3 handles duplicate map keys + if yamlErr = yaml.Unmarshal(data, v); yamlErr == nil { + return nil } - return nil + + // If both unmarshaling attempts fail, return a new error that includes both errors + return fmt.Errorf("failed to unmarshal data: json error: %v, yaml error: %v", jsonErr, yamlErr) }