diff --git a/Sources/_OpenAPIGeneratorCore/Parser/validateDoc.swift b/Sources/_OpenAPIGeneratorCore/Parser/validateDoc.swift index ed6e08a2..6e44986c 100644 --- a/Sources/_OpenAPIGeneratorCore/Parser/validateDoc.swift +++ b/Sources/_OpenAPIGeneratorCore/Parser/validateDoc.swift @@ -303,7 +303,7 @@ func validateDoc(_ doc: ParsedOpenAPIRepresentation, config: Config) throws -> [ // block the generator from running. // Validation errors continue to be fatal, such as // structural issues, like non-unique operationIds, etc. - let warnings = try doc.validate(using: Validator().validating(.operationsContainResponses), strict: false) + let warnings = try doc.validate(using: .swiftOpenAPICustomValidator, strict: false) let diagnostics: [Diagnostic] = warnings.map { warning in .warning( message: "Validation warning: \(warning.description)", @@ -315,3 +315,27 @@ func validateDoc(_ doc: ParsedOpenAPIRepresentation, config: Config) throws -> [ } return typeOverrideDiagnostics + diagnostics } + +extension OpenAPIKit.Validator { + static var swiftOpenAPICustomValidator: Validator { + // Start with blank. + .blank + // Add defaults as of OpenAPIKit 6.0.0 + // https://github.com/mattpolzin/OpenAPIKit/blob/118d039/Sources/OpenAPIKit/Validator/Validator.swift#L184-L186 + .validating(.documentTagNamesAreUnique).validating(.documentServerNamesAreUnique) + .validating(.pathItemParametersAreUnique).validating(.operationParametersAreUnique) + .validating(.querystringParametersAreCompatible).validating(.operationIdsAreUnique) + .validating(.serverVariableEnumIsValid).validating(.serverVariableDefaultExistsInEnum) + // Without this one to be backwards compatible with previous versions of Swift OpenAPI Generator. + // Even when run with strict=false, this one will cause OpenAPIKit to throw an error. Previous verions were more + // lenient and Swift OpenAPI Generator would later emit a warning that it's unsupported. + // .validating(.parameterStyleAndLocationAreCompatible) + .validating(.schemaReferencesAreValid).validating(.jsonSchemaReferencesAreValid) + .validating(.responseReferencesAreValid).validating(.parameterReferencesAreValid) + .validating(.exampleReferencesAreValid).validating(.requestReferencesAreValid) + .validating(.headerReferencesAreValid).validating(.linkReferencesAreValid) + .validating(.callbacksReferencesAreValid).validating(.pathItemReferencesAreValid) + // And also add in this one. + .validating(.operationsContainResponses) + } +} diff --git a/Tests/OpenAPIGeneratorCoreTests/Parser/Test_validateDoc.swift b/Tests/OpenAPIGeneratorCoreTests/Parser/Test_validateDoc.swift index b876620d..d7388f30 100644 --- a/Tests/OpenAPIGeneratorCoreTests/Parser/Test_validateDoc.swift +++ b/Tests/OpenAPIGeneratorCoreTests/Parser/Test_validateDoc.swift @@ -480,6 +480,38 @@ final class Test_validateDoc: Test_Core { ) } } + func testParameterStyleLocationMismatchIsNotFatal() throws { + let yaml = """ + openapi: "3.0.0" + info: + title: "Test" + version: "1.0.0" + paths: + /foo: + parameters: + - name: foo + in: query + style: simple + explode: false + schema: + type: string + """ + let doc = try YamsParser.parseOpenAPIDocument( + .init(absolutePath: URL(fileURLWithPath: "/foo.yaml"), contents: Data(yaml.utf8)), + diagnostics: PrintingDiagnosticCollector() + ) + XCTAssertNoThrow( + try validateDoc( + doc, + config: .init( + mode: .types, + access: Config.defaultAccessModifier, + namingStrategy: Config.defaultNamingStrategy + ) + ) + ) + } + func testValidateTypeOverrides() throws { let schema = try loadSchemaFromYAML( #"""