diff --git a/modules/openapi-generator/src/main/resources/swift5/Models.mustache b/modules/openapi-generator/src/main/resources/swift5/Models.mustache index 40775e4b82a5..fc775bb778b1 100644 --- a/modules/openapi-generator/src/main/resources/swift5/Models.mustache +++ b/modules/openapi-generator/src/main/resources/swift5/Models.mustache @@ -36,6 +36,19 @@ extension CaseIterableDefaultsLast { } } +{{#enumUnknownDefaultCase}} +/// Protocol for types used as oneOf variants, allowing the oneOf decoder to reject +/// a variant that only decoded successfully because CaseIterableDefaultsLast +/// silently accepted an unknown enum value. +protocol UnknownCaseCheckable { + var containsUnknownDefaultOpenApiCase: Bool { get } +} + +extension UnknownCaseCheckable { + {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var containsUnknownDefaultOpenApiCase: Bool { false } +} + +{{/enumUnknownDefaultCase}} /// A flexible type that can be encoded (`.encodeNull` or `.encodeValue`) /// or not encoded (`.encodeNothing`). Intended for request payloads. {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum NullEncodable: Hashable { diff --git a/modules/openapi-generator/src/main/resources/swift5/model.mustache b/modules/openapi-generator/src/main/resources/swift5/model.mustache index 4a77dc7aca91..9b8bb7aa611c 100644 --- a/modules/openapi-generator/src/main/resources/swift5/model.mustache +++ b/modules/openapi-generator/src/main/resources/swift5/model.mustache @@ -30,4 +30,40 @@ extension {{projectName}}API { {{/swiftUseApiNamespace}}{{#models}}{{#model}}{{#vendorExtensions.x-swift-identifiable}} @available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *) extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: Identifiable {} -{{/vendorExtensions.x-swift-identifiable}}{{/model}}{{/models}} \ No newline at end of file +{{/vendorExtensions.x-swift-identifiable}}{{#enumUnknownDefaultCase}}{{^vendorExtensions.x-is-one-of-interface}}{{^isArray}}{{^isEnum}}{{#hasEnums}} +extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: UnknownCaseCheckable { + {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var containsUnknownDefaultOpenApiCase: Bool { + {{#allVars}} + {{#isEnum}} + {{^isContainer}} + {{#vendorExtensions.x-null-encodable}} + if {{{name}}} == .encodeValue(.unknownDefaultOpenApi) { return true } + {{/vendorExtensions.x-null-encodable}} + {{^vendorExtensions.x-null-encodable}} + if {{{name}}} == .unknownDefaultOpenApi { return true } + {{/vendorExtensions.x-null-encodable}} + {{/isContainer}} + {{/isEnum}} + {{^isEnum}} + {{#isEnumRef}} + {{^isContainer}} + {{#vendorExtensions.x-null-encodable}} + if {{{name}}} == .encodeValue(.unknownDefaultOpenApi) { return true } + {{/vendorExtensions.x-null-encodable}} + {{^vendorExtensions.x-null-encodable}} + if {{{name}}} == .unknownDefaultOpenApi { return true } + {{/vendorExtensions.x-null-encodable}} + {{/isContainer}} + {{/isEnumRef}} + {{/isEnum}} + {{/allVars}} + return false + } +} +{{/hasEnums}}{{/isEnum}}{{/isArray}}{{/vendorExtensions.x-is-one-of-interface}}{{#isEnum}} +extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: UnknownCaseCheckable { + {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var containsUnknownDefaultOpenApiCase: Bool { + self == .unknownDefaultOpenApi + } +} +{{/isEnum}}{{/enumUnknownDefaultCase}}{{/model}}{{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/swift5/modelOneOf.mustache b/modules/openapi-generator/src/main/resources/swift5/modelOneOf.mustache index ec8c1bde0459..546bcc1f7f3b 100644 --- a/modules/openapi-generator/src/main/resources/swift5/modelOneOf.mustache +++ b/modules/openapi-generator/src/main/resources/swift5/modelOneOf.mustache @@ -51,10 +51,10 @@ {{/discriminator}}{{^discriminator}} let container = try decoder.singleValueContainer() {{#oneOf}} {{#-first}} - if let value = try? container.decode({{.}}.self) { + if let value = try? container.decode({{.}}.self){{#enumUnknownDefaultCase}}, (value as? UnknownCaseCheckable)?.containsUnknownDefaultOpenApiCase != true{{/enumUnknownDefaultCase}} { {{/-first}} {{^-first}} - } else if let value = try? container.decode({{.}}.self) { + } else if let value = try? container.decode({{.}}.self){{#enumUnknownDefaultCase}}, (value as? UnknownCaseCheckable)?.containsUnknownDefaultOpenApiCase != true{{/enumUnknownDefaultCase}} { {{/-first}} self = .type{{.}}(value) {{/oneOf}} diff --git a/modules/openapi-generator/src/main/resources/swift6/Models.mustache b/modules/openapi-generator/src/main/resources/swift6/Models.mustache index 1189b1d836cf..7e7bb883922a 100644 --- a/modules/openapi-generator/src/main/resources/swift6/Models.mustache +++ b/modules/openapi-generator/src/main/resources/swift6/Models.mustache @@ -36,6 +36,19 @@ extension CaseIterableDefaultsLast { } } +{{#enumUnknownDefaultCase}} +/// Protocol for types used as oneOf variants, allowing the oneOf decoder to reject +/// a variant that only decoded successfully because CaseIterableDefaultsLast +/// silently accepted an unknown enum value. +protocol UnknownCaseCheckable { + var containsUnknownDefaultOpenApiCase: Bool { get } +} + +extension UnknownCaseCheckable { + {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var containsUnknownDefaultOpenApiCase: Bool { false } +} + +{{/enumUnknownDefaultCase}} /// A flexible type that can be encoded (`.encodeNull` or `.encodeValue`) /// or not encoded (`.encodeNothing`). Intended for request payloads. {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum NullEncodable { diff --git a/modules/openapi-generator/src/main/resources/swift6/model.mustache b/modules/openapi-generator/src/main/resources/swift6/model.mustache index 8f3127a0bdaf..ac2d6b53eb28 100644 --- a/modules/openapi-generator/src/main/resources/swift6/model.mustache +++ b/modules/openapi-generator/src/main/resources/swift6/model.mustache @@ -26,4 +26,40 @@ extension {{projectName}}API { } {{/swiftUseApiNamespace}}{{#models}}{{#model}}{{#vendorExtensions.x-swift-identifiable}} extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: Identifiable {} -{{/vendorExtensions.x-swift-identifiable}}{{/model}}{{/models}} \ No newline at end of file +{{/vendorExtensions.x-swift-identifiable}}{{#enumUnknownDefaultCase}}{{^vendorExtensions.x-is-one-of-interface}}{{^isArray}}{{^isEnum}}{{#hasEnums}} +extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: UnknownCaseCheckable { + {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var containsUnknownDefaultOpenApiCase: Bool { + {{#allVars}} + {{#isEnum}} + {{^isContainer}} + {{#vendorExtensions.x-null-encodable}} + if {{{name}}} == .encodeValue(.unknownDefaultOpenApi) { return true } + {{/vendorExtensions.x-null-encodable}} + {{^vendorExtensions.x-null-encodable}} + if {{{name}}} == .unknownDefaultOpenApi { return true } + {{/vendorExtensions.x-null-encodable}} + {{/isContainer}} + {{/isEnum}} + {{^isEnum}} + {{#isEnumRef}} + {{^isContainer}} + {{#vendorExtensions.x-null-encodable}} + if {{{name}}} == .encodeValue(.unknownDefaultOpenApi) { return true } + {{/vendorExtensions.x-null-encodable}} + {{^vendorExtensions.x-null-encodable}} + if {{{name}}} == .unknownDefaultOpenApi { return true } + {{/vendorExtensions.x-null-encodable}} + {{/isContainer}} + {{/isEnumRef}} + {{/isEnum}} + {{/allVars}} + return false + } +} +{{/hasEnums}}{{/isEnum}}{{/isArray}}{{/vendorExtensions.x-is-one-of-interface}}{{#isEnum}} +extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: UnknownCaseCheckable { + {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var containsUnknownDefaultOpenApiCase: Bool { + self == .unknownDefaultOpenApi + } +} +{{/isEnum}}{{/enumUnknownDefaultCase}}{{/model}}{{/models}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/swift6/modelOneOf.mustache b/modules/openapi-generator/src/main/resources/swift6/modelOneOf.mustache index b2efa05ef38d..eeb9b2129561 100644 --- a/modules/openapi-generator/src/main/resources/swift6/modelOneOf.mustache +++ b/modules/openapi-generator/src/main/resources/swift6/modelOneOf.mustache @@ -51,10 +51,10 @@ {{/discriminator}}{{^discriminator}} let container = try decoder.singleValueContainer() {{#oneOf}} {{#-first}} - if let value = try? container.decode({{.}}.self) { + if let value = try? container.decode({{.}}.self){{#enumUnknownDefaultCase}}, (value as? UnknownCaseCheckable)?.containsUnknownDefaultOpenApiCase != true{{/enumUnknownDefaultCase}} { {{/-first}} {{^-first}} - } else if let value = try? container.decode({{.}}.self) { + } else if let value = try? container.decode({{.}}.self){{#enumUnknownDefaultCase}}, (value as? UnknownCaseCheckable)?.containsUnknownDefaultOpenApiCase != true{{/enumUnknownDefaultCase}} { {{/-first}} self = .type{{#transformArrayType}}{{.}}{{/transformArrayType}}(value) {{/oneOf}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift6/Swift6ClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift6/Swift6ClientCodegenTest.java index 1bba4234b30f..254fae5f0a43 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift6/Swift6ClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/swift6/Swift6ClientCodegenTest.java @@ -364,6 +364,38 @@ public void oneOfArrayTypeNamesTest() throws IOException { } } + @Test(description = "test oneOf with enumUnknownDefaultCase generates UnknownCaseCheckable guard", enabled = true) + public void oneOfEnumUnknownDefaultCaseGuardTest() throws IOException { + Path target = Files.createTempDirectory("test"); + File output = target.toFile(); + try { + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("swift6") + .setInputSpec("src/test/resources/3_0/oneOf.yaml") + .setOutputDir(target.toAbsolutePath().toString()) + .addAdditionalProperty("enumUnknownDefaultCase", true); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(false); + generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); + generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); + generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "true"); + + List files = generator.opts(clientOptInput).generate(); + + String oneOfContent = Files.readString(files.stream() + .filter(f -> f.getName().equals("Fruit.swift")).findFirst().get().toPath()); + Assert.assertTrue(oneOfContent.contains("as? UnknownCaseCheckable)?.containsUnknownDefaultOpenApiCase != true"), + "oneOf decoder should guard against unknown default enum cases"); + + String modelsContent = Files.readString(files.stream() + .filter(f -> f.getName().equals("Models.swift")).findFirst().get().toPath()); + Assert.assertTrue(modelsContent.contains("protocol UnknownCaseCheckable")); + } finally { + output.deleteOnExit(); + } + } + @Test(description = "test oneOf with discriminator generates discriminator-first decoding", enabled = true) public void oneOfDiscriminatorFirstDecodingTest() throws IOException { Path target = Files.createTempDirectory("test"); diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift index c68e2814791b..4bad0eba6cc3 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models.swift @@ -35,6 +35,17 @@ extension CaseIterableDefaultsLast { } } +/// Protocol for types used as oneOf variants, allowing the oneOf decoder to reject +/// a variant that only decoded successfully because CaseIterableDefaultsLast +/// silently accepted an unknown enum value. +protocol UnknownCaseCheckable { + var containsUnknownDefaultOpenApiCase: Bool { get } +} + +extension UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { false } +} + /// A flexible type that can be encoded (`.encodeNull` or `.encodeValue`) /// or not encoded (`.encodeNothing`). Intended for request payloads. internal enum NullEncodable: Hashable { diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift index 6773182d75dd..5facb6271f8a 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift @@ -44,3 +44,10 @@ internal struct EnumArrays: Codable, JSONEncodable { } } + +extension EnumArrays: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if justSymbol == .unknownDefaultOpenApi { return true } + return false + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift index e1d7b2218364..314870766fb2 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift @@ -16,3 +16,9 @@ internal enum EnumClass: String, Codable, CaseIterable, CaseIterableDefaultsLast case xyz = "(xyz)" case unknownDefaultOpenApi = "unknown_default_open_api" } + +extension EnumClass: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + self == .unknownDefaultOpenApi + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift index aef79e53cc61..471cd8c2895f 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift @@ -70,3 +70,14 @@ internal struct EnumTest: Codable, JSONEncodable { } } + +extension EnumTest: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if enumString == .unknownDefaultOpenApi { return true } + if enumStringRequired == .unknownDefaultOpenApi { return true } + if enumInteger == .unknownDefaultOpenApi { return true } + if enumNumber == .unknownDefaultOpenApi { return true } + if outerEnum == .unknownDefaultOpenApi { return true } + return false + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift index 08a3bbb46c7f..56e5c2650d0d 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift @@ -47,3 +47,9 @@ internal struct MapTest: Codable, JSONEncodable { } } + +extension MapTest: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + return false + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift index ed296f7a5d82..c2f9f9a287ba 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift @@ -60,3 +60,10 @@ internal struct Order: Codable, JSONEncodable { @available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *) extension Order: Identifiable {} + +extension Order: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if status == .unknownDefaultOpenApi { return true } + return false + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift index 1d7f53eadb4b..aa2d5ad3ec3b 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift @@ -19,3 +19,9 @@ internal enum OuterEnum: String, Codable, CaseIterable, CaseIterableDefaultsLast case delivered = "delivered" case unknownDefaultOpenApi = "unknown_default_open_api" } + +extension OuterEnum: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + self == .unknownDefaultOpenApi + } +} diff --git a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift index 6bf8f949388b..cf8baff4e1e8 100644 --- a/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift +++ b/samples/client/petstore/swift5/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift @@ -63,3 +63,10 @@ internal struct Pet: Codable, JSONEncodable, Hashable { @available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *) extension Pet: Identifiable {} + +extension Pet: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if status == .encodeValue(.unknownDefaultOpenApi) { return true } + return false + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Infrastructure/Models.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Infrastructure/Models.swift index ca30258f63d4..684e7891f0bc 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Infrastructure/Models.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Infrastructure/Models.swift @@ -35,6 +35,17 @@ extension CaseIterableDefaultsLast { } } +/// Protocol for types used as oneOf variants, allowing the oneOf decoder to reject +/// a variant that only decoded successfully because CaseIterableDefaultsLast +/// silently accepted an unknown enum value. +protocol UnknownCaseCheckable { + var containsUnknownDefaultOpenApiCase: Bool { get } +} + +extension UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { false } +} + /// A flexible type that can be encoded (`.encodeNull` or `.encodeValue`) /// or not encoded (`.encodeNothing`). Intended for request payloads. internal enum NullEncodable { diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift index 8c65df7075e2..4b78eb83d95e 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumArrays.swift @@ -41,3 +41,10 @@ internal struct EnumArrays: Sendable, Codable { } } + +extension EnumArrays: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if justSymbol == .unknownDefaultOpenApi { return true } + return false + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift index 3e38a7f73f9a..a3749936b334 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumClass.swift @@ -13,3 +13,9 @@ internal enum EnumClass: String, Sendable, Codable, CaseIterable, CaseIterableDe case xyz = "(xyz)" case unknownDefaultOpenApi = "unknown_default_open_api" } + +extension EnumClass: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + self == .unknownDefaultOpenApi + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift index 316a470ee28d..5ec8b17f4ee4 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/EnumTest.swift @@ -67,3 +67,14 @@ internal struct EnumTest: Sendable, Codable { } } + +extension EnumTest: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if enumString == .unknownDefaultOpenApi { return true } + if enumStringRequired == .unknownDefaultOpenApi { return true } + if enumInteger == .unknownDefaultOpenApi { return true } + if enumNumber == .unknownDefaultOpenApi { return true } + if outerEnum == .unknownDefaultOpenApi { return true } + return false + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift index 01d2c81bb457..e2183ffb35a2 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/MapTest.swift @@ -44,3 +44,9 @@ internal struct MapTest: Sendable, Codable { } } + +extension MapTest: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + return false + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift index 013c50f5f44b..9323d346544d 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Order.swift @@ -56,3 +56,10 @@ internal struct Order: Sendable, Codable { extension Order: Identifiable {} + +extension Order: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if status == .unknownDefaultOpenApi { return true } + return false + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift index b3b34786e7eb..a5b722eabbfc 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/OuterEnum.swift @@ -16,3 +16,9 @@ internal enum OuterEnum: String, Sendable, Codable, CaseIterable, CaseIterableDe case delivered = "delivered" case unknownDefaultOpenApi = "unknown_default_open_api" } + +extension OuterEnum: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + self == .unknownDefaultOpenApi + } +} diff --git a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift index 68dcc5b859f5..fb9b58a4d59d 100644 --- a/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift +++ b/samples/client/petstore/swift6/resultLibrary/PetstoreClient/Classes/OpenAPIs/Models/Pet.swift @@ -59,3 +59,10 @@ internal struct Pet: Sendable, Codable, Hashable { extension Pet: Identifiable {} + +extension Pet: UnknownCaseCheckable { + internal var containsUnknownDefaultOpenApiCase: Bool { + if status == .encodeValue(.unknownDefaultOpenApi) { return true } + return false + } +}