diff --git a/.swiftformatignore b/.swiftformatignore index cff6e77d..6e7b6990 100644 --- a/.swiftformatignore +++ b/.swiftformatignore @@ -1,4 +1,5 @@ Tests/OpenAPIGeneratorReferenceTests/Resources Sources/swift-openapi-generator/Documentation.docc Examples/**/Generated/* -Examples/**/GeneratedSources/* \ No newline at end of file +Examples/**/GeneratedSources/* +**Package.swift diff --git a/Package.swift b/Package.swift index c27b6235..44e952d8 100644 --- a/Package.swift +++ b/Package.swift @@ -147,3 +147,14 @@ let package = Package( ), ] ) + +// --- STANDARD CROSS-REPO SETTINGS DO NOT EDIT --- // +for target in package.targets { + if target.type != .plugin { + var settings = target.swiftSettings ?? [] + // https://github.com/swiftlang/swift-evolution/blob/main/proposals/0444-member-import-visibility.md + settings.append(.enableUpcomingFeature("MemberImportVisibility")) + target.swiftSettings = settings + } +} +// --- END: STANDARD CROSS-REPO SETTINGS DO NOT EDIT --- // diff --git a/Sources/_OpenAPIGeneratorCore/Layers/StructuredSwiftRepresentation.swift b/Sources/_OpenAPIGeneratorCore/Layers/StructuredSwiftRepresentation.swift index 6be4a80f..3bd64062 100644 --- a/Sources/_OpenAPIGeneratorCore/Layers/StructuredSwiftRepresentation.swift +++ b/Sources/_OpenAPIGeneratorCore/Layers/StructuredSwiftRepresentation.swift @@ -1354,6 +1354,16 @@ extension Expression { /// - Returns: A new expression representing member access with a dot prefix. static func dot(_ member: String) -> Self { Self.memberAccess(.init(right: member)) } + /// Returns a new member access expression with `self` as the receiver. + /// + /// For example: `self.foo`, where `member` is `foo`. + /// + /// - Parameter member: The name of the member to access on the expression. + /// - Returns: A new expression representing member access. + static func selfDot(_ member: String) -> Expression { + .memberAccess(.init(left: .identifier(.pattern("self")), right: member)) + } + /// Returns a new identifier expression for the provided pattern, such /// as a variable or function name. /// - Parameter name: The name of the identifier. @@ -1555,6 +1565,7 @@ extension Expression { /// - Parameter expressions: The member expressions. /// - Returns: A tuple expression. static func tuple(_ expressions: [Expression]) -> Self { .tuple(.init(members: expressions)) } + } extension MemberAccessDescription { diff --git a/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift b/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift index 884b7aa7..abc6a722 100644 --- a/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift +++ b/Sources/_OpenAPIGeneratorCore/Translator/CommonTranslations/translateCodable.swift @@ -118,7 +118,7 @@ extension FileTranslator { let assignExprs: [Expression] = properties.map { property in let typeUsage = property.typeUsage return .assignment( - left: .identifierPattern("self").dot(property.swiftSafeName), + left: .selfDot(property.swiftSafeName), right: .try( .identifierPattern("container").dot("decode\(typeUsage.isOptional ? "IfPresent" : "")") .call([ @@ -156,7 +156,7 @@ extension FileTranslator { .try( .identifierPattern("container").dot("encode\(property.typeUsage.isOptional ? "IfPresent" : "")") .call([ - .init(label: nil, expression: .identifierPattern(property.swiftSafeName)), + .init(label: nil, expression: .selfDot(property.swiftSafeName)), .init(label: "forKey", expression: .dot(property.swiftSafeName)), ]) ) @@ -181,7 +181,7 @@ extension FileTranslator { let assignExprs: [Expression] = properties.map { property, isKeyValuePair in let decoderExpr: Expression = isKeyValuePair ? .initFromDecoderExpr() : .decodeFromSingleValueContainerExpr() - return .assignment(left: .identifierPattern(property.swiftSafeName), right: .try(decoderExpr)) + return .assignment(left: .selfDot(property.swiftSafeName), right: .try(decoderExpr)) } return decoderInitializer(body: assignExprs.map { .expression($0) }) } @@ -194,12 +194,11 @@ extension FileTranslator { { let exprs: [Expression] if let firstSingleValue = properties.first(where: { !$0.isKeyValuePair }) { - let expr: Expression = .identifierPattern(firstSingleValue.property.swiftSafeName) + let expr: Expression = .selfDot(firstSingleValue.property.swiftSafeName) .encodeToSingleValueContainerExpr(gracefully: false) exprs = [expr] } else { - exprs = properties.filter { $0.isKeyValuePair }.map(\.property.swiftSafeName) - .map { name in .identifierPattern(name).encodeExpr() } + exprs = properties.filter(\.isKeyValuePair).map { .selfDot($0.property.swiftSafeName).encodeExpr() } } return encoderFunction(body: exprs.map { .expression($0) }) } @@ -216,10 +215,7 @@ extension FileTranslator { let assignBlocks: [CodeBlock] = properties.map { (property, isKeyValuePair) in let decoderExpr: Expression = isKeyValuePair ? .initFromDecoderExpr() : .decodeFromSingleValueContainerExpr() - let assignExpr: Expression = .assignment( - left: .identifierPattern(property.swiftSafeName), - right: .try(decoderExpr) - ) + let assignExpr: Expression = .assignment(left: .selfDot(property.swiftSafeName), right: .try(decoderExpr)) return .expression(assignExpr.wrapInDoCatchAppendArrayExpr()) } let atLeastOneNotNilCheckExpr: Expression = .try( @@ -227,7 +223,7 @@ extension FileTranslator { .call([ .init( label: nil, - expression: .literal(.array(properties.map { .identifierPattern($0.property.swiftSafeName) })) + expression: .literal(.array(properties.map { .selfDot($0.property.swiftSafeName) })) ), .init(label: "type", expression: .identifierPattern("Self").dot("self")), .init(label: "codingPath", expression: .identifierPattern("decoder").dot("codingPath")), .init(label: "errors", expression: .identifierPattern("errors")), @@ -250,14 +246,12 @@ extension FileTranslator { ? nil : .try( .identifierPattern("encoder").dot("encodeFirstNonNilValueToSingleValueContainer") - .call([ - .init(label: nil, expression: .literal(.array(singleValueNames.map { .identifierPattern($0) }))) - ]) + .call([.init(label: nil, expression: .literal(.array(singleValueNames.map { .selfDot($0) })))]) ) let encodeExprs: [Expression] = (encodeSingleValuesExpr.flatMap { [$0] } ?? []) + properties.filter { $0.isKeyValuePair }.map(\.property) - .map { property in .identifierPattern(property.swiftSafeName).optionallyChained().encodeExpr() } + .map { property in .selfDot(property.swiftSafeName).optionallyChained().encodeExpr() } return encoderFunction(body: encodeExprs.map { .expression($0) }) } diff --git a/Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateBoxedTypes.swift b/Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateBoxedTypes.swift index ce2da20d..3c6a98e1 100644 --- a/Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateBoxedTypes.swift +++ b/Sources/_OpenAPIGeneratorCore/Translator/TypesTranslator/translateBoxedTypes.swift @@ -107,10 +107,8 @@ extension TypesFileTranslator { case .variable(var variableDescription) = commented else { return member } let name = TextBasedRenderer.renderedExpressionAsString(variableDescription.left) - variableDescription.getter = [.expression(.identifierPattern("storage").dot("value").dot(name))] - variableDescription.modify = [ - .expression(.yield(.inOut(.identifierPattern("storage").dot("value").dot(name)))) - ] + variableDescription.getter = [.expression(.selfDot("storage").dot("value").dot(name))] + variableDescription.modify = [.expression(.yield(.inOut(.selfDot("storage").dot("value").dot(name))))] return .commentable(comment, .variable(variableDescription)) } @@ -127,7 +125,7 @@ extension TypesFileTranslator { funcDesc.body = [ .expression( .assignment( - left: .identifierPattern("storage"), + left: .selfDot("storage"), right: .dot("init") .call([ .init( @@ -167,7 +165,7 @@ extension TypesFileTranslator { body: [ .expression( .assignment( - left: .identifierPattern("storage"), + left: .selfDot("storage"), right: .try( .dot("init").call([.init(label: "from", expression: .identifierPattern("decoder"))]) ) @@ -185,7 +183,7 @@ extension TypesFileTranslator { body: [ .expression( .try( - .identifierPattern("storage").dot("encode") + .selfDot("storage").dot("encode") .call([.init(label: "to", expression: .identifierPattern("encoder"))]) ) ) diff --git a/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml b/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml index ac8a417d..1d9a5ed5 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml +++ b/Tests/OpenAPIGeneratorReferenceTests/Resources/Docs/petstore.yaml @@ -406,6 +406,14 @@ components: type: [array, null] items: type: [string, null] + # To catch the clashes of members and the decoding container. + TypedAdditionalPropertiesWithPropertyNamedContainer: + type: object + properties: + container: + type: string + additionalProperties: + type: integer CodeError: type: object properties: diff --git a/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift b/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift index 71de33ec..b482b8cb 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift +++ b/Tests/OpenAPIGeneratorReferenceTests/Resources/ReferenceSources/Petstore/Types.swift @@ -355,31 +355,31 @@ public enum Components { public init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try decoder.decodeFromSingleValueContainer() + self.value1 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } do { - value2 = try decoder.decodeFromSingleValueContainer() + self.value2 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } do { - value3 = try .init(from: decoder) + self.value3 = try .init(from: decoder) } catch { errors.append(error) } do { - value4 = try decoder.decodeFromSingleValueContainer() + self.value4 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2, - value3, - value4 + self.value1, + self.value2, + self.value3, + self.value4 ], type: Self.self, codingPath: decoder.codingPath, @@ -388,11 +388,11 @@ public enum Components { } public func encode(to encoder: any Encoder) throws { try encoder.encodeFirstNonNilValueToSingleValueContainer([ - value1, - value2, - value4 + self.value1, + self.value2, + self.value4 ]) - try value3?.encode(to: encoder) + try self.value3?.encode(to: encoder) } } /// - Remark: Generated from `#/components/schemas/MixedOneOf`. @@ -459,11 +459,11 @@ public enum Components { self.value2 = value2 } public init(from decoder: any Decoder) throws { - value1 = try decoder.decodeFromSingleValueContainer() - value2 = try decoder.decodeFromSingleValueContainer() + self.value1 = try decoder.decodeFromSingleValueContainer() + self.value2 = try decoder.decodeFromSingleValueContainer() } public func encode(to encoder: any Encoder) throws { - try encoder.encodeToSingleValueContainer(value1) + try encoder.encodeToSingleValueContainer(self.value1) } } /// Kind of pet @@ -637,7 +637,7 @@ public enum Components { public func encode(to encoder: any Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent( - foo, + self.foo, forKey: .foo ) try encoder.encodeAdditionalProperties(additionalProperties) @@ -677,7 +677,7 @@ public enum Components { public func encode(to encoder: any Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent( - foo, + self.foo, forKey: .foo ) try encoder.encodeAdditionalProperties(additionalProperties) @@ -698,6 +698,46 @@ public enum Components { case foo } } + /// - Remark: Generated from `#/components/schemas/TypedAdditionalPropertiesWithPropertyNamedContainer`. + public struct TypedAdditionalPropertiesWithPropertyNamedContainer: Codable, Hashable, Sendable { + /// - Remark: Generated from `#/components/schemas/TypedAdditionalPropertiesWithPropertyNamedContainer/container`. + public var container: Swift.String? + /// A container of undocumented properties. + public var additionalProperties: [String: Swift.Int] + /// Creates a new `TypedAdditionalPropertiesWithPropertyNamedContainer`. + /// + /// - Parameters: + /// - container: + /// - additionalProperties: A container of undocumented properties. + public init( + container: Swift.String? = nil, + additionalProperties: [String: Swift.Int] = .init() + ) { + self.container = container + self.additionalProperties = additionalProperties + } + public enum CodingKeys: String, CodingKey { + case container + } + public init(from decoder: any Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self.container = try container.decodeIfPresent( + Swift.String.self, + forKey: .container + ) + additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: [ + "container" + ]) + } + public func encode(to encoder: any Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent( + self.container, + forKey: .container + ) + try encoder.encodeAdditionalProperties(additionalProperties) + } + } /// - Remark: Generated from `#/components/schemas/CodeError`. public struct CodeError: Codable, Hashable, Sendable { /// - Remark: Generated from `#/components/schemas/CodeError/code`. @@ -747,12 +787,12 @@ public enum Components { self.value2 = value2 } public init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) - value2 = try .init(from: decoder) + self.value1 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try value1.encode(to: encoder) - try value2.encode(to: encoder) + try self.value1.encode(to: encoder) + try self.value2.encode(to: encoder) } } /// - Remark: Generated from `#/components/schemas/AnyOfObjects`. @@ -791,19 +831,19 @@ public enum Components { public init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } catch { errors.append(error) } do { - value2 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2 + self.value1, + self.value2 ], type: Self.self, codingPath: decoder.codingPath, @@ -811,8 +851,8 @@ public enum Components { ) } public func encode(to encoder: any Encoder) throws { - try value1?.encode(to: encoder) - try value2?.encode(to: encoder) + try self.value1?.encode(to: encoder) + try self.value2?.encode(to: encoder) } } /// - Remark: Generated from `#/components/schemas/OneOfAny`. @@ -957,12 +997,12 @@ public enum Components { self.value2 = value2 } public init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) - value2 = try .init(from: decoder) + self.value1 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try value1.encode(to: encoder) - try value2.encode(to: encoder) + try self.value1.encode(to: encoder) + try self.value2.encode(to: encoder) } } /// - Remark: Generated from `#/components/schemas/OneOfObjectsWithDiscriminator`. @@ -1022,19 +1062,19 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePet/name`. public var name: Swift.String { get { - storage.value.name + self.storage.value.name } _modify { - yield &storage.value.name + yield &self.storage.value.name } } /// - Remark: Generated from `#/components/schemas/RecursivePet/parent`. public var parent: Components.Schemas.RecursivePet? { get { - storage.value.parent + self.storage.value.parent } _modify { - yield &storage.value.parent + yield &self.storage.value.parent } } /// Creates a new `RecursivePet`. @@ -1046,7 +1086,7 @@ public enum Components { name: Swift.String, parent: Components.Schemas.RecursivePet? = nil ) { - storage = .init(value: .init( + self.storage = .init(value: .init( name: name, parent: parent )) @@ -1056,10 +1096,10 @@ public enum Components { case parent } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } /// Internal reference storage to allow type recursion. private var storage: OpenAPIRuntime.CopyOnWriteBox @@ -1083,10 +1123,10 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePetNested/name`. public var name: Swift.String { get { - storage.value.name + self.storage.value.name } _modify { - yield &storage.value.name + yield &self.storage.value.name } } /// - Remark: Generated from `#/components/schemas/RecursivePetNested/parent`. @@ -1107,10 +1147,10 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePetNested/parent`. public var parent: Components.Schemas.RecursivePetNested.parentPayload? { get { - storage.value.parent + self.storage.value.parent } _modify { - yield &storage.value.parent + yield &self.storage.value.parent } } /// Creates a new `RecursivePetNested`. @@ -1122,7 +1162,7 @@ public enum Components { name: Swift.String, parent: Components.Schemas.RecursivePetNested.parentPayload? = nil ) { - storage = .init(value: .init( + self.storage = .init(value: .init( name: name, parent: parent )) @@ -1132,10 +1172,10 @@ public enum Components { case parent } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } /// Internal reference storage to allow type recursion. private var storage: OpenAPIRuntime.CopyOnWriteBox @@ -1174,10 +1214,10 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePetOneOfFirst/value1`. public var value1: Components.Schemas.RecursivePetOneOf { get { - storage.value.value1 + self.storage.value.value1 } _modify { - yield &storage.value.value1 + yield &self.storage.value.value1 } } /// - Remark: Generated from `#/components/schemas/RecursivePetOneOfFirst/value2`. @@ -1198,10 +1238,10 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePetOneOfFirst/value2`. public var value2: Components.Schemas.RecursivePetOneOfFirst.Value2Payload { get { - storage.value.value2 + self.storage.value.value2 } _modify { - yield &storage.value.value2 + yield &self.storage.value.value2 } } /// Creates a new `RecursivePetOneOfFirst`. @@ -1213,16 +1253,16 @@ public enum Components { value1: Components.Schemas.RecursivePetOneOf, value2: Components.Schemas.RecursivePetOneOfFirst.Value2Payload ) { - storage = .init(value: .init( + self.storage = .init(value: .init( value1: value1, value2: value2 )) } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } /// Internal reference storage to allow type recursion. private var storage: OpenAPIRuntime.CopyOnWriteBox @@ -1254,12 +1294,12 @@ public enum Components { self.value2 = value2 } init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) - value2 = try .init(from: decoder) + self.value1 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } func encode(to encoder: any Encoder) throws { - try value1.encode(to: encoder) - try value2.encode(to: encoder) + try self.value1.encode(to: encoder) + try self.value2.encode(to: encoder) } } } @@ -1297,12 +1337,12 @@ public enum Components { self.value2 = value2 } public init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) - value2 = try .init(from: decoder) + self.value1 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try value1.encode(to: encoder) - try value2.encode(to: encoder) + try self.value1.encode(to: encoder) + try self.value2.encode(to: encoder) } } /// - Remark: Generated from `#/components/schemas/RecursivePetOneOf`. @@ -1347,19 +1387,19 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePetAnyOf/value1`. public var value1: Components.Schemas.RecursivePetAnyOf? { get { - storage.value.value1 + self.storage.value.value1 } _modify { - yield &storage.value.value1 + yield &self.storage.value.value1 } } /// - Remark: Generated from `#/components/schemas/RecursivePetAnyOf/value2`. public var value2: Swift.String? { get { - storage.value.value2 + self.storage.value.value2 } _modify { - yield &storage.value.value2 + yield &self.storage.value.value2 } } /// Creates a new `RecursivePetAnyOf`. @@ -1371,16 +1411,16 @@ public enum Components { value1: Components.Schemas.RecursivePetAnyOf? = nil, value2: Swift.String? = nil ) { - storage = .init(value: .init( + self.storage = .init(value: .init( value1: value1, value2: value2 )) } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } /// Internal reference storage to allow type recursion. private var storage: OpenAPIRuntime.CopyOnWriteBox @@ -1399,19 +1439,19 @@ public enum Components { init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } catch { errors.append(error) } do { - value2 = try decoder.decodeFromSingleValueContainer() + self.value2 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2 + self.value1, + self.value2 ], type: Self.self, codingPath: decoder.codingPath, @@ -1420,9 +1460,9 @@ public enum Components { } func encode(to encoder: any Encoder) throws { try encoder.encodeFirstNonNilValueToSingleValueContainer([ - value2 + self.value2 ]) - try value1?.encode(to: encoder) + try self.value1?.encode(to: encoder) } } } @@ -1446,10 +1486,10 @@ public enum Components { /// - Remark: Generated from `#/components/schemas/RecursivePetAllOf/value1`. public var value1: Components.Schemas.RecursivePetAllOf.Value1Payload { get { - storage.value.value1 + self.storage.value.value1 } _modify { - yield &storage.value.value1 + yield &self.storage.value.value1 } } /// Creates a new `RecursivePetAllOf`. @@ -1457,13 +1497,13 @@ public enum Components { /// - Parameters: /// - value1: public init(value1: Components.Schemas.RecursivePetAllOf.Value1Payload) { - storage = .init(value: .init(value1: value1)) + self.storage = .init(value: .init(value1: value1)) } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } /// Internal reference storage to allow type recursion. private var storage: OpenAPIRuntime.CopyOnWriteBox @@ -1489,10 +1529,10 @@ public enum Components { self.value1 = value1 } init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } func encode(to encoder: any Encoder) throws { - try value1.encode(to: encoder) + try self.value1.encode(to: encoder) } } } diff --git a/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift b/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift index a00b3cbc..3013bd7b 100644 --- a/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift +++ b/Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift @@ -547,20 +547,42 @@ final class SnippetBasedReferenceTests: XCTestCase { schemas: MyObject: type: object - properties: {} + properties: + id: + type: string additionalProperties: true """, """ public enum Schemas { public struct MyObject: Codable, Hashable, Sendable { + public var id: Swift.String? public var additionalProperties: OpenAPIRuntime.OpenAPIObjectContainer - public init(additionalProperties: OpenAPIRuntime.OpenAPIObjectContainer = .init()) { + public init( + id: Swift.String? = nil, + additionalProperties: OpenAPIRuntime.OpenAPIObjectContainer = .init() + ) { + self.id = id self.additionalProperties = additionalProperties } + public enum CodingKeys: String, CodingKey { + case id + } public init(from decoder: any Decoder) throws { - additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: []) + let container = try decoder.container(keyedBy: CodingKeys.self) + self.id = try container.decodeIfPresent( + Swift.String.self, + forKey: .id + ) + additionalProperties = try decoder.decodeAdditionalProperties(knownKeys: [ + "id" + ]) } public func encode(to encoder: any Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent( + self.id, + forKey: .id + ) try encoder.encodeAdditionalProperties(additionalProperties) } } @@ -726,13 +748,13 @@ final class SnippetBasedReferenceTests: XCTestCase { self.value4 = value4 } public init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) - value2 = try .init(from: decoder) - value3 = try decoder.decodeFromSingleValueContainer() - value4 = try decoder.decodeFromSingleValueContainer() + self.value1 = try .init(from: decoder) + self.value2 = try .init(from: decoder) + self.value3 = try decoder.decodeFromSingleValueContainer() + self.value4 = try decoder.decodeFromSingleValueContainer() } public func encode(to encoder: any Encoder) throws { - try encoder.encodeToSingleValueContainer(value3) + try encoder.encodeToSingleValueContainer(self.value3) } } } @@ -778,31 +800,31 @@ final class SnippetBasedReferenceTests: XCTestCase { public init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } catch { errors.append(error) } do { - value2 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } catch { errors.append(error) } do { - value3 = try decoder.decodeFromSingleValueContainer() + self.value3 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } do { - value4 = try decoder.decodeFromSingleValueContainer() + self.value4 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2, - value3, - value4 + self.value1, + self.value2, + self.value3, + self.value4 ], type: Self.self, codingPath: decoder.codingPath, @@ -811,11 +833,11 @@ final class SnippetBasedReferenceTests: XCTestCase { } public func encode(to encoder: any Encoder) throws { try encoder.encodeFirstNonNilValueToSingleValueContainer([ - value3, - value4 + self.value3, + self.value4 ]) - try value1?.encode(to: encoder) - try value2?.encode(to: encoder) + try self.value1?.encode(to: encoder) + try self.value2?.encode(to: encoder) } } } @@ -1154,19 +1176,19 @@ final class SnippetBasedReferenceTests: XCTestCase { public init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } catch { errors.append(error) } do { - value2 = try .init(from: decoder) + self.value2 = try .init(from: decoder) } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2 + self.value1, + self.value2 ], type: Self.self, codingPath: decoder.codingPath, @@ -1174,8 +1196,8 @@ final class SnippetBasedReferenceTests: XCTestCase { ) } public func encode(to encoder: any Encoder) throws { - try value1?.encode(to: encoder) - try value2?.encode(to: encoder) + try self.value1?.encode(to: encoder) + try self.value2?.encode(to: encoder) } } } @@ -1202,10 +1224,10 @@ final class SnippetBasedReferenceTests: XCTestCase { self.value1 = value1 } public init(from decoder: any Decoder) throws { - value1 = try decoder.decodeFromSingleValueContainer() + self.value1 = try decoder.decodeFromSingleValueContainer() } public func encode(to encoder: any Encoder) throws { - try encoder.encodeToSingleValueContainer(value1) + try encoder.encodeToSingleValueContainer(self.value1) } } } @@ -1238,10 +1260,10 @@ final class SnippetBasedReferenceTests: XCTestCase { self.value1 = value1 } public init(from decoder: any Decoder) throws { - value1 = try decoder.decodeFromSingleValueContainer() + self.value1 = try decoder.decodeFromSingleValueContainer() } public func encode(to encoder: any Encoder) throws { - try encoder.encodeToSingleValueContainer(value1) + try encoder.encodeToSingleValueContainer(self.value1) } } public var c: Components.Schemas.B.cPayload @@ -1281,10 +1303,10 @@ final class SnippetBasedReferenceTests: XCTestCase { self.value1 = value1 } public init(from decoder: any Decoder) throws { - value1 = try decoder.decodeFromSingleValueContainer() + self.value1 = try decoder.decodeFromSingleValueContainer() } public func encode(to encoder: any Encoder) throws { - try encoder.encodeToSingleValueContainer(value1) + try encoder.encodeToSingleValueContainer(self.value1) } } public var c: Components.Schemas.B.cPayload? @@ -1406,19 +1428,19 @@ final class SnippetBasedReferenceTests: XCTestCase { public init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try decoder.decodeFromSingleValueContainer() + self.value1 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } do { - value2 = try decoder.decodeFromSingleValueContainer() + self.value2 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2 + self.value1, + self.value2 ], type: Self.self, codingPath: decoder.codingPath, @@ -1427,8 +1449,8 @@ final class SnippetBasedReferenceTests: XCTestCase { } public func encode(to encoder: any Encoder) throws { try encoder.encodeFirstNonNilValueToSingleValueContainer([ - value1, - value2 + self.value1, + self.value2 ]) } } @@ -1563,23 +1585,23 @@ final class SnippetBasedReferenceTests: XCTestCase { public struct Node: Codable, Hashable, Sendable { public var parent: Components.Schemas.Node? { get { - storage.value.parent + self.storage.value.parent } _modify { - yield &storage.value.parent + yield &self.storage.value.parent } } public init(parent: Components.Schemas.Node? = nil) { - storage = .init(value: .init(parent: parent)) + self.storage = .init(value: .init(parent: parent)) } public enum CodingKeys: String, CodingKey { case parent } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } private var storage: OpenAPIRuntime.CopyOnWriteBox private struct Storage: Codable, Hashable, Sendable { @@ -1619,10 +1641,10 @@ final class SnippetBasedReferenceTests: XCTestCase { public struct Node: Codable, Hashable, Sendable { public var name: Swift.String { get { - storage.value.name + self.storage.value.name } _modify { - yield &storage.value.name + yield &self.storage.value.name } } public struct parentPayload: Codable, Hashable, Sendable { @@ -1636,17 +1658,17 @@ final class SnippetBasedReferenceTests: XCTestCase { } public var parent: Components.Schemas.Node.parentPayload? { get { - storage.value.parent + self.storage.value.parent } _modify { - yield &storage.value.parent + yield &self.storage.value.parent } } public init( name: Swift.String, parent: Components.Schemas.Node.parentPayload? = nil ) { - storage = .init(value: .init( + self.storage = .init(value: .init( name: name, parent: parent )) @@ -1656,10 +1678,10 @@ final class SnippetBasedReferenceTests: XCTestCase { case parent } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } private var storage: OpenAPIRuntime.CopyOnWriteBox private struct Storage: Codable, Hashable, Sendable { @@ -1714,20 +1736,20 @@ final class SnippetBasedReferenceTests: XCTestCase { } public var value1: Components.Schemas.Node.Value1Payload { get { - storage.value.value1 + self.storage.value.value1 } _modify { - yield &storage.value.value1 + yield &self.storage.value.value1 } } public init(value1: Components.Schemas.Node.Value1Payload) { - storage = .init(value: .init(value1: value1)) + self.storage = .init(value: .init(value1: value1)) } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } private var storage: OpenAPIRuntime.CopyOnWriteBox private struct Storage: Codable, Hashable, Sendable { @@ -1745,10 +1767,10 @@ final class SnippetBasedReferenceTests: XCTestCase { self.value1 = value1 } init(from decoder: any Decoder) throws { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } func encode(to encoder: any Encoder) throws { - try value1.encode(to: encoder) + try self.value1.encode(to: encoder) } } } @@ -1771,34 +1793,34 @@ final class SnippetBasedReferenceTests: XCTestCase { public struct Node: Codable, Hashable, Sendable { public var value1: Components.Schemas.Node? { get { - storage.value.value1 + self.storage.value.value1 } _modify { - yield &storage.value.value1 + yield &self.storage.value.value1 } } public var value2: Swift.String? { get { - storage.value.value2 + self.storage.value.value2 } _modify { - yield &storage.value.value2 + yield &self.storage.value.value2 } } public init( value1: Components.Schemas.Node? = nil, value2: Swift.String? = nil ) { - storage = .init(value: .init( + self.storage = .init(value: .init( value1: value1, value2: value2 )) } public init(from decoder: any Decoder) throws { - storage = try .init(from: decoder) + self.storage = try .init(from: decoder) } public func encode(to encoder: any Encoder) throws { - try storage.encode(to: encoder) + try self.storage.encode(to: encoder) } private var storage: OpenAPIRuntime.CopyOnWriteBox private struct Storage: Codable, Hashable, Sendable { @@ -1814,19 +1836,19 @@ final class SnippetBasedReferenceTests: XCTestCase { init(from decoder: any Decoder) throws { var errors: [any Error] = [] do { - value1 = try .init(from: decoder) + self.value1 = try .init(from: decoder) } catch { errors.append(error) } do { - value2 = try decoder.decodeFromSingleValueContainer() + self.value2 = try decoder.decodeFromSingleValueContainer() } catch { errors.append(error) } try Swift.DecodingError.verifyAtLeastOneSchemaIsNotNil( [ - value1, - value2 + self.value1, + self.value2 ], type: Self.self, codingPath: decoder.codingPath, @@ -1835,9 +1857,9 @@ final class SnippetBasedReferenceTests: XCTestCase { } func encode(to encoder: any Encoder) throws { try encoder.encodeFirstNonNilValueToSingleValueContainer([ - value2 + self.value2 ]) - try value1?.encode(to: encoder) + try self.value1?.encode(to: encoder) } } }