diff --git a/.github/docs/openapi3.txt b/.github/docs/openapi3.txt index 3eee44d4e..352ca8ae4 100644 --- a/.github/docs/openapi3.txt +++ b/.github/docs/openapi3.txt @@ -2612,6 +2612,22 @@ func (e *SchemaBothFormsExclusive) Error() string func (e *SchemaBothFormsExclusive) Unwrap() error +type SchemaCombinatorElementValidationError struct { + // Combinator is the keyword whose element failed ("oneOf", "anyOf", + // "allOf"). + Combinator string + Cause error +} + SchemaCombinatorElementValidationError wraps a validation error originating + in one of the sub-schemas listed under a schema's oneOf, anyOf, or allOf + keyword. Combinator names which keyword the offending element belongs + to ("oneOf", "anyOf", "allOf"). The wrapper adds the combinator scope; + the actual failure lives in Cause. + +func (e *SchemaCombinatorElementValidationError) Error() string + +func (e *SchemaCombinatorElementValidationError) Unwrap() error + type SchemaError struct { // Value is the value that failed validation. Value any @@ -3318,6 +3334,19 @@ func (t *Tag) UnmarshalJSON(data []byte) error func (t *Tag) Validate(ctx context.Context, opts ...ValidationOption) error Validate returns an error if Tag does not comply with the OpenAPI spec. +type TagValidationError struct { + // Name is the tag's `name:` value. + Name string + Cause error +} + TagValidationError wraps a validation error originating inside a single tag + in the document-root Tags list. Name is the tag's `name:` value, so callers + can tell which tag failed without parsing the rendered message. + +func (e *TagValidationError) Error() string + +func (e *TagValidationError) Unwrap() error + type Tags []*Tag Tags is specified by OpenAPI/Swagger 3.0 standard. diff --git a/openapi3/openapi3_test.go b/openapi3/openapi3_test.go index 3df69cb51..c83899868 100644 --- a/openapi3/openapi3_test.go +++ b/openapi3/openapi3_test.go @@ -425,7 +425,7 @@ components: name: "tags section is invalid", spec: strings.Replace(spec, tags, strings.ReplaceAll(tags, "url: https://tags-ext-docs.com", "url: ''"), 1), - expectedErr: "invalid tags: invalid external docs: url is required", + expectedErr: "invalid tags: tag \"pet\": invalid external docs: url is required", }, } for i := range tests { diff --git a/openapi3/schema.go b/openapi3/schema.go index 1f5eebdb8..3505e4999 100644 --- a/openapi3/schema.go +++ b/openapi3/schema.go @@ -1554,7 +1554,7 @@ func (schema *Schema) validate(ctx context.Context, stack []*Schema) ([]*Schema, var err error if stack, err = v.validate(ctx, stack); err != nil { - return stack, err + return stack, &SchemaCombinatorElementValidationError{Combinator: "oneOf", Cause: err} } } @@ -1566,7 +1566,7 @@ func (schema *Schema) validate(ctx context.Context, stack []*Schema) ([]*Schema, var err error if stack, err = v.validate(ctx, stack); err != nil { - return stack, err + return stack, &SchemaCombinatorElementValidationError{Combinator: "anyOf", Cause: err} } } @@ -1578,7 +1578,7 @@ func (schema *Schema) validate(ctx context.Context, stack []*Schema) ([]*Schema, var err error if stack, err = v.validate(ctx, stack); err != nil { - return stack, err + return stack, &SchemaCombinatorElementValidationError{Combinator: "allOf", Cause: err} } } diff --git a/openapi3/tag.go b/openapi3/tag.go index c022a252d..98b4a9167 100644 --- a/openapi3/tag.go +++ b/openapi3/tag.go @@ -24,7 +24,8 @@ func (tags Tags) Validate(ctx context.Context, opts ...ValidationOption) error { me := newErrCollector(ctx) for _, v := range tags { - if err := me.emit(v.Validate(ctx)); err != nil { + wrap := func(e error) error { return &TagValidationError{Name: v.Name, Cause: e} } + if err := me.emitWrapped(wrap, v.Validate(ctx)); err != nil { return err } } diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_acm_2015_12_08_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_acm_2015_12_08_openapi_yaml__validate index b48dd7e95..715a45653 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_acm_2015_12_08_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_acm_2015_12_08_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "CertificateDetail": error parsing regexp: invalid or unsupported Perl syntax: `(?!` +invalid components: schema "CertificateDetail": invalid allOf element: error parsing regexp: invalid or unsupported Perl syntax: `(?!` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_alexaforbusiness_2017_11_09_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_alexaforbusiness_2017_11_09_openapi_yaml__validate index 550733dbd..ff7ffce32 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_alexaforbusiness_2017_11_09_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_alexaforbusiness_2017_11_09_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "AddressBook": error parsing regexp: invalid repeat count: `{0,1023}` +invalid components: schema "AddressBook": invalid allOf element: error parsing regexp: invalid repeat count: `{0,1023}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_amplify_2017_07_25_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_amplify_2017_07_25_openapi_yaml__validate index 715e8aca6..947949c1b 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_amplify_2017_07_25_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_amplify_2017_07_25_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "CreateDomainAssociationRequest": error parsing regexp: invalid or unsupported Perl syntax: `(?!` +invalid components: schema "CreateDomainAssociationRequest": invalid allOf element: error parsing regexp: invalid or unsupported Perl syntax: `(?!` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appconfigdata_2021_11_11_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appconfigdata_2021_11_11_openapi_yaml__validate index c98a4dd42..fcf2ca260 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appconfigdata_2021_11_11_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appconfigdata_2021_11_11_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "StartConfigurationSessionResponse": error parsing regexp: invalid repeat count: `{1,8192}` +invalid components: schema "StartConfigurationSessionResponse": invalid allOf element: error parsing regexp: invalid repeat count: `{1,8192}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_application_autoscaling_2016_02_06_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_application_autoscaling_2016_02_06_openapi_yaml__validate index f2eeb73e1..113b96659 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_application_autoscaling_2016_02_06_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_application_autoscaling_2016_02_06_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "DescribeScalingPoliciesResponse": error parsing regexp: invalid character class range: `\p{Print}` +invalid components: schema "DescribeScalingPoliciesResponse": invalid allOf element: error parsing regexp: invalid character class range: `\p{Print}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_applicationcostprofiler_2020_09_10_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_applicationcostprofiler_2020_09_10_openapi_yaml__validate index 4bd96fdd9..8f9ca62b2 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_applicationcostprofiler_2020_09_10_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_applicationcostprofiler_2020_09_10_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "GetReportDefinitionResult": error parsing regexp: invalid or unsupported Perl syntax: `(?=` +invalid components: schema "GetReportDefinitionResult": invalid allOf element: error parsing regexp: invalid or unsupported Perl syntax: `(?=` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appstream_2016_12_01_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appstream_2016_12_01_openapi_yaml__validate index d89536f6b..913be73f1 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appstream_2016_12_01_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_appstream_2016_12_01_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "AppBlock": error parsing regexp: invalid repeat count: `{0,1023}` +invalid components: schema "AppBlock": invalid allOf element: error parsing regexp: invalid repeat count: `{0,1023}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_autoscaling_plans_2018_01_06_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_autoscaling_plans_2018_01_06_openapi_yaml__validate index cad19b68f..b4569ec60 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_autoscaling_plans_2018_01_06_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_autoscaling_plans_2018_01_06_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "CreateScalingPlanRequest": error parsing regexp: invalid character class range: `\p{Print}` +invalid components: schema "CreateScalingPlanRequest": invalid allOf element: error parsing regexp: invalid character class range: `\p{Print}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_2018_05_01_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_2018_05_01_openapi_yaml__validate index c2f8e8ff6..ecce35c5b 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_2018_05_01_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_2018_05_01_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "AppInstance": error parsing regexp: invalid repeat count: `{0,1023}` +invalid components: schema "AppInstance": invalid allOf element: error parsing regexp: invalid repeat count: `{0,1023}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_identity_2021_04_20_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_identity_2021_04_20_openapi_yaml__validate index c2f8e8ff6..ecce35c5b 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_identity_2021_04_20_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_identity_2021_04_20_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "AppInstance": error parsing regexp: invalid repeat count: `{0,1023}` +invalid components: schema "AppInstance": invalid allOf element: error parsing regexp: invalid repeat count: `{0,1023}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_meetings_2021_07_15_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_meetings_2021_07_15_openapi_yaml__validate index 80c0a40d8..22dfec454 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_meetings_2021_07_15_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_meetings_2021_07_15_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "CreateMeetingRequest": error parsing regexp: invalid or unsupported Perl syntax: `(?!` +invalid components: schema "CreateMeetingRequest": invalid allOf element: error parsing regexp: invalid or unsupported Perl syntax: `(?!` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_messaging_2021_05_15_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_messaging_2021_05_15_openapi_yaml__validate index 3b3d11143..64e10153d 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_messaging_2021_05_15_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_chime_sdk_messaging_2021_05_15_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "AssociateChannelFlowRequest": error parsing regexp: invalid repeat count: `{0,1023}` +invalid components: schema "AssociateChannelFlowRequest": invalid allOf element: error parsing regexp: invalid repeat count: `{0,1023}` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cleanrooms_2022_02_17_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cleanrooms_2022_02_17_openapi_yaml__validate index f59a27ba9..1afaa3dc2 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cleanrooms_2022_02_17_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cleanrooms_2022_02_17_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "Collaboration": error parsing regexp: invalid or unsupported Perl syntax: `(?!` +invalid components: schema "Collaboration": invalid allOf element: error parsing regexp: invalid or unsupported Perl syntax: `(?!` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_codecatalyst_2022_09_28_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_codecatalyst_2022_09_28_openapi_yaml__validate index d10c7930f..8e94045f5 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_codecatalyst_2022_09_28_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_codecatalyst_2022_09_28_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "CreateDevEnvironmentRequest": error parsing regexp: invalid or unsupported Perl syntax: `(?!` +invalid components: schema "CreateDevEnvironmentRequest": invalid allOf element: error parsing regexp: invalid or unsupported Perl syntax: `(?!` diff --git a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cognito_idp_2016_04_18_openapi_yaml__validate b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cognito_idp_2016_04_18_openapi_yaml__validate index 40733e408..29693cb70 100644 --- a/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cognito_idp_2016_04_18_openapi_yaml__validate +++ b/openapi3/testdata/apis_guru_openapi_directory/amazonaws_com_cognito_idp_2016_04_18_openapi_yaml__validate @@ -1 +1 @@ -invalid components: schema "DescribeUserPoolDomainResponse": error parsing regexp: invalid named capture: `(?