diff --git a/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateSchema.swift b/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateSchema.swift index e92b5605..dc2cac4b 100644 --- a/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateSchema.swift +++ b/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateSchema.swift @@ -87,6 +87,21 @@ extension TypesFileTranslator { ) ) } + if let substituteTypeName = schema.vendorExtensions["x-swift-open-api-substitute-type"]?.value + as? String + { + try diagnostics.emit(.note(message: "Substituting type \(typeName) with \(substituteTypeName)")) + let substitutedType = TypeName(swiftKeyPath: substituteTypeName.components(separatedBy: ".")).asUsage + + let typealiasDecl = try translateTypealias( + named: typeName, + userDescription: overrides.userDescription ?? schema.description, + to: substitutedType.withOptional( + overrides.isOptional ?? typeMatcher.isOptional(schema, components: components) + ) + ) + return [typealiasDecl] + } // If this type maps to a referenceable schema, define a typealias if let builtinType = try typeMatcher.tryMatchReferenceableType(for: schema, components: components) { diff --git a/Tests/OpenAPIGeneratorCoreTests/Translator/TypesTranslator/Test_translateSchemas.swift b/Tests/OpenAPIGeneratorCoreTests/Translator/TypesTranslator/Test_translateSchemas.swift index 1d1e89f5..6ae27414 100644 --- a/Tests/OpenAPIGeneratorCoreTests/Translator/TypesTranslator/Test_translateSchemas.swift +++ b/Tests/OpenAPIGeneratorCoreTests/Translator/TypesTranslator/Test_translateSchemas.swift @@ -47,4 +47,30 @@ class Test_translateSchemas: Test_Core { XCTAssertEqual(collector.diagnostics.map(\.description), diagnosticDescriptions) } } + + func testSchemaTypeSubstitution() throws { + let typeName = TypeName(swiftKeyPath: ["Foo"]) + + let schema = try loadSchemaFromYAML( + #""" + type: string + x-swift-open-api-substitute-type: MyLibrary.MyCustomType + """# + ) + let collector = AccumulatingDiagnosticCollector() + let translator = makeTranslator(diagnostics: collector) + let translated = try translator.translateSchema(typeName: typeName, schema: schema, overrides: .none) + + XCTAssertEqual( + collector.diagnostics.map(\.description), + ["note: Substituting type Foo with MyLibrary.MyCustomType"] + ) + XCTAssertTrue(translated.count == 1, "Should have one translated schema") + guard case let .typealias(typeAliasDescription) = translated.first?.strippingTopComment else { + XCTFail("Expected typealias description got") + return + } + XCTAssertEqual(typeAliasDescription.name, "Foo") + XCTAssertEqual(typeAliasDescription.existingType, .member(["MyLibrary", "MyCustomType"])) + } }