diff --git a/Sources/OpenAPIKit/Component Object/Components.swift b/Sources/OpenAPIKit/Component Object/Components.swift index a372091af..bf9f4b4be 100644 --- a/Sources/OpenAPIKit/Component Object/Components.swift +++ b/Sources/OpenAPIKit/Component Object/Components.swift @@ -199,7 +199,7 @@ extension OpenAPI.Components { case examples case requestBodies case headers - case securitySchemes + case securitySchemes // case links // case callbacks diff --git a/Sources/OpenAPIKit/Content/Content.swift b/Sources/OpenAPIKit/Content/Content.swift index 9d3703f1f..e4eb386ef 100644 --- a/Sources/OpenAPIKit/Content/Content.swift +++ b/Sources/OpenAPIKit/Content/Content.swift @@ -121,7 +121,7 @@ extension OpenAPI.Content: Encodable { try container.encode(example, forKey: .example) } - try encoding.encodeIfNotNil(to: &container, forKey: .encoding) + try container.encodeIfPresent(encoding, forKey: .encoding) try encodeExtensions(to: &container) } diff --git a/Sources/OpenAPIKit/Content/ContentEncoding.swift b/Sources/OpenAPIKit/Content/ContentEncoding.swift index edba1df14..2ed837285 100644 --- a/Sources/OpenAPIKit/Content/ContentEncoding.swift +++ b/Sources/OpenAPIKit/Content/ContentEncoding.swift @@ -50,9 +50,8 @@ extension OpenAPI.Content.Encoding: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try contentType.encodeIfNotNil(to: &container, forKey: .contentType) - - try headers.encodeIfNotNil(to: &container, forKey: .headers) + try container.encodeIfPresent(contentType, forKey: .contentType) + try container.encodeIfPresent(headers, forKey: .headers) if style != Self.defaultStyle { try container.encode(style, forKey: .style) diff --git a/Sources/OpenAPIKit/Discriminator.swift b/Sources/OpenAPIKit/Discriminator.swift index c4274a88b..ab8ea4de4 100644 --- a/Sources/OpenAPIKit/Discriminator.swift +++ b/Sources/OpenAPIKit/Discriminator.swift @@ -30,8 +30,7 @@ extension OpenAPI.Discriminator: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(propertyName, forKey: .propertyName) - - try mapping.encodeIfNotNil(to: &container, forKey: .mapping) + try container.encodeIfPresent(mapping, forKey: .mapping) } } @@ -40,7 +39,6 @@ extension OpenAPI.Discriminator: Decodable { let container = try decoder.container(keyedBy: CodingKeys.self) propertyName = try container.decode(String.self, forKey: .propertyName) - mapping = try container.decodeIfPresent([String: String].self, forKey: .mapping) } } diff --git a/Sources/OpenAPIKit/Document.swift b/Sources/OpenAPIKit/Document.swift index c637ece40..31e4e631a 100644 --- a/Sources/OpenAPIKit/Document.swift +++ b/Sources/OpenAPIKit/Document.swift @@ -77,7 +77,6 @@ extension OpenAPI.Document: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(openAPIVersion, forKey: .openAPIVersion) - try container.encode(info, forKey: .info) if !servers.isEmpty { @@ -96,9 +95,8 @@ extension OpenAPI.Document: Encodable { try encodeSecurity(requirements: security, to: &container, forKey: .security) } - try tags.encodeIfNotNil(to: &container, forKey: .tags) - - try externalDocs.encodeIfNotNil(to: &container, forKey: .externalDocs) + try container.encodeIfPresent(tags, forKey: .tags) + try container.encodeIfPresent(externalDocs, forKey: .externalDocs) try encodeExtensions(to: &container) } @@ -110,9 +108,7 @@ extension OpenAPI.Document: Decodable { do { openAPIVersion = try container.decode(OpenAPI.Document.Version.self, forKey: .openAPIVersion) - info = try container.decode(OpenAPI.Document.Info.self, forKey: .info) - servers = try container.decodeIfPresent([OpenAPI.Server].self, forKey: .servers) ?? [] let components = try container.decodeIfPresent(OpenAPI.Components.self, forKey: .components) ?? .noComponents @@ -123,11 +119,8 @@ extension OpenAPI.Document: Decodable { try validateSecurityRequirements(in: paths, against: components) security = try decodeSecurityRequirements(from: container, forKey: .security, given: components) ?? [] - tags = try container.decodeIfPresent([OpenAPI.Tag].self, forKey: .tags) - externalDocs = try container.decodeIfPresent(OpenAPI.ExternalDocumentation.self, forKey: .externalDocs) - vendorExtensions = try Self.extensions(from: decoder) } catch let error as OpenAPI.Error.Decoding.Path { diff --git a/Sources/OpenAPIKit/DocumentInfo.swift b/Sources/OpenAPIKit/DocumentInfo.swift index d173d3985..ce0e1ce09 100644 --- a/Sources/OpenAPIKit/DocumentInfo.swift +++ b/Sources/OpenAPIKit/DocumentInfo.swift @@ -119,8 +119,7 @@ extension OpenAPI.Document.Info.License: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(name, forKey: .name) - - try url.encodeIfNotNil(to: &container, forKey: .url) + try container.encodeIfPresent(url, forKey: .url) try encodeExtensions(to: &container) } @@ -192,11 +191,9 @@ extension OpenAPI.Document.Info.Contact: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try name.encodeIfNotNil(to: &container, forKey: .name) - - try url.encodeIfNotNil(to: &container, forKey: .url) - - try email.encodeIfNotNil(to: &container, forKey: .email) + try container.encodeIfPresent(name, forKey: .name) + try container.encodeIfPresent(url, forKey: .url) + try container.encodeIfPresent(email, forKey: .email) try encodeExtensions(to: &container) } @@ -207,9 +204,7 @@ extension OpenAPI.Document.Info.Contact: Decodable { let container = try decoder.container(keyedBy: CodingKeys.self) name = try container.decodeIfPresent(String.self, forKey: .name) - url = try container.decodeIfPresent(URL.self, forKey: .url) - email = try container.decodeIfPresent(String.self, forKey: .email) vendorExtensions = try Self.extensions(from: decoder) @@ -277,15 +272,10 @@ extension OpenAPI.Document.Info: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(title, forKey: .title) - - try description.encodeIfNotNil(to: &container, forKey: .description) - - try termsOfService.encodeIfNotNil(to: &container, forKey: .termsOfService) - - try contact.encodeIfNotNil(to: &container, forKey: .contact) - - try license.encodeIfNotNil(to: &container, forKey: .license) - + try container.encodeIfPresent(description, forKey: .description) + try container.encodeIfPresent(termsOfService, forKey: .termsOfService) + try container.encodeIfPresent(contact, forKey: .contact) + try container.encodeIfPresent(license, forKey: .license) try container.encode(version, forKey: .version) try encodeExtensions(to: &container) @@ -297,15 +287,10 @@ extension OpenAPI.Document.Info: Decodable { let container = try decoder.container(keyedBy: CodingKeys.self) title = try container.decode(String.self, forKey: .title) - description = try container.decodeIfPresent(String.self, forKey: .description) - termsOfService = try container.decodeIfPresent(URL.self, forKey: .termsOfService) - contact = try container.decodeIfPresent(Contact.self, forKey: .contact) - license = try container.decodeIfPresent(License.self, forKey: .license) - version = try container.decode(String.self, forKey: .version) vendorExtensions = try Self.extensions(from: decoder) diff --git a/Sources/OpenAPIKit/Example.swift b/Sources/OpenAPIKit/Example.swift index 5e683226e..07c4b7731 100644 --- a/Sources/OpenAPIKit/Example.swift +++ b/Sources/OpenAPIKit/Example.swift @@ -65,9 +65,8 @@ extension OpenAPI.Example: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try summary.encodeIfNotNil(to: &container, forKey: .summary) - - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(summary, forKey: .summary) + try container.encodeIfPresent(description, forKey: .description) switch value { case .a(let url): @@ -95,7 +94,6 @@ extension OpenAPI.Example: Decodable { let externalValue = try container.decodeIfPresent(URL.self, forKey: .externalValue) summary = try container.decodeIfPresent(String.self, forKey: .summary) - description = try container.decodeIfPresent(String.self, forKey: .description) value = try externalValue.map(Either.init) diff --git a/Sources/OpenAPIKit/ExternalDoc.swift b/Sources/OpenAPIKit/ExternalDoc.swift index c79df0521..77090bf0b 100644 --- a/Sources/OpenAPIKit/ExternalDoc.swift +++ b/Sources/OpenAPIKit/ExternalDoc.swift @@ -29,8 +29,7 @@ extension OpenAPI.ExternalDocumentation: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try description.encodeIfNotNil(to: &container, forKey: .description) - + try container.encodeIfPresent(description, forKey: .description) try container.encode(url, forKey: .url) } } @@ -40,7 +39,6 @@ extension OpenAPI.ExternalDocumentation: Decodable { let container = try decoder.container(keyedBy: CodingKeys.self) description = try container.decodeIfPresent(String.self, forKey: .description) - url = try container.decode(URL.self, forKey: .url) } } diff --git a/Sources/OpenAPIKit/Header.swift b/Sources/OpenAPIKit/Header.swift index 59f7ed73b..90c18a6f3 100644 --- a/Sources/OpenAPIKit/Header.swift +++ b/Sources/OpenAPIKit/Header.swift @@ -150,7 +150,7 @@ extension OpenAPI.Header: Encodable { try container.encode(contentMap, forKey: .content) } - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(description, forKey: .description) if deprecated { try container.encode(deprecated, forKey: .deprecated) diff --git a/Sources/OpenAPIKit/OAuthFlows.swift b/Sources/OpenAPIKit/OAuthFlows.swift index 05adb3687..5c925fb53 100644 --- a/Sources/OpenAPIKit/OAuthFlows.swift +++ b/Sources/OpenAPIKit/OAuthFlows.swift @@ -149,10 +149,10 @@ extension OpenAPI.OAuthFlows: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try implicit.encodeIfNotNil(to: &container, forKey: .implicit) - try password.encodeIfNotNil(to: &container, forKey: .password) - try clientCredentials.encodeIfNotNil(to: &container, forKey: .clientCredentials) - try authorizationCode.encodeIfNotNil(to: &container, forKey: .authorizationCode) + try container.encodeIfPresent(implicit, forKey: .implicit) + try container.encodeIfPresent(password, forKey: .password) + try container.encodeIfPresent(clientCredentials, forKey: .clientCredentials) + try container.encodeIfPresent(authorizationCode, forKey: .authorizationCode) } } @@ -171,7 +171,7 @@ extension OpenAPI.OAuthFlows.CommonFields: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try refreshUrl.encodeIfNotNil(to: &container, forKey: .refreshUrl) + try container.encodeIfPresent(refreshUrl, forKey: .refreshUrl) try container.encode(scopes, forKey: .scopes) } } diff --git a/Sources/OpenAPIKit/Operation.swift b/Sources/OpenAPIKit/Operation.swift index 020b5120b..ccd6d22cf 100644 --- a/Sources/OpenAPIKit/Operation.swift +++ b/Sources/OpenAPIKit/Operation.swift @@ -120,21 +120,17 @@ extension OpenAPI.Operation: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try tags.encodeIfNotNil(to: &container, forKey: .tags) - - try summary.encodeIfNotNil(to: &container, forKey: .summary) - - try description.encodeIfNotNil(to: &container, forKey: .description) - - try externalDocs.encodeIfNotNil(to: &container, forKey: .externalDocs) - - try operationId.encodeIfNotNil(to: &container, forKey: .operationId) + try container.encodeIfPresent(tags, forKey: .tags) + try container.encodeIfPresent(summary, forKey: .summary) + try container.encodeIfPresent(description, forKey: .description) + try container.encodeIfPresent(externalDocs, forKey: .externalDocs) + try container.encodeIfPresent(operationId, forKey: .operationId) if !parameters.isEmpty { try container.encode(parameters, forKey: .parameters) } - try requestBody.encodeIfNotNil(to: &container, forKey: .requestBody) + try container.encodeIfPresent(requestBody, forKey: .requestBody) try container.encode(responses, forKey: .responses) @@ -146,8 +142,8 @@ extension OpenAPI.Operation: Encodable { try encodeSecurity(requirements: securityRequirements, to: &container, forKey: .security) } - try servers.encodeIfNotNil(to: &container, forKey: .servers) - + try container.encodeIfPresent(servers, forKey: .servers) + try encodeExtensions(to: &container) } } diff --git a/Sources/OpenAPIKit/Parameter/Parameter.swift b/Sources/OpenAPIKit/Parameter/Parameter.swift index 6fe10522c..2e3f5dd86 100644 --- a/Sources/OpenAPIKit/Parameter/Parameter.swift +++ b/Sources/OpenAPIKit/Parameter/Parameter.swift @@ -195,7 +195,7 @@ extension OpenAPI.Parameter: Encodable { try container.encode(contentMap, forKey: .content) } - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(description, forKey: .description) if deprecated { try container.encode(deprecated, forKey: .deprecated) diff --git a/Sources/OpenAPIKit/PathItem.swift b/Sources/OpenAPIKit/PathItem.swift index 7ec86eba9..c2ca1cd2f 100644 --- a/Sources/OpenAPIKit/PathItem.swift +++ b/Sources/OpenAPIKit/PathItem.swift @@ -233,24 +233,22 @@ extension OpenAPI.PathItem: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try summary.encodeIfNotNil(to: &container, forKey: .summary) - - try description.encodeIfNotNil(to: &container, forKey: .description) - - try servers.encodeIfNotNil(to: &container, forKey: .servers) + try container.encodeIfPresent(summary, forKey: .summary) + try container.encodeIfPresent(description, forKey: .description) + try container.encodeIfPresent(servers, forKey: .servers) if !parameters.isEmpty { try container.encode(parameters, forKey: .parameters) } - try get.encodeIfNotNil(to: &container, forKey: .get) - try put.encodeIfNotNil(to: &container, forKey: .put) - try post.encodeIfNotNil(to: &container, forKey: .post) - try delete.encodeIfNotNil(to: &container, forKey: .delete) - try options.encodeIfNotNil(to: &container, forKey: .options) - try head.encodeIfNotNil(to: &container, forKey: .head) - try patch.encodeIfNotNil(to: &container, forKey: .patch) - try trace.encodeIfNotNil(to: &container, forKey: .trace) + try container.encodeIfPresent(get, forKey: .get) + try container.encodeIfPresent(put, forKey: .put) + try container.encodeIfPresent(post, forKey: .post) + try container.encodeIfPresent(delete, forKey: .delete) + try container.encodeIfPresent(options, forKey: .options) + try container.encodeIfPresent(head, forKey: .head) + try container.encodeIfPresent(patch, forKey: .patch) + try container.encodeIfPresent(trace, forKey: .trace) try encodeExtensions(to: &container) } @@ -262,11 +260,8 @@ extension OpenAPI.PathItem: Decodable { do { summary = try container.decodeIfPresent(String.self, forKey: .summary) - description = try container.decodeIfPresent(String.self, forKey: .description) - servers = try container.decodeIfPresent([OpenAPI.Server].self, forKey: .servers) - parameters = try container.decodeIfPresent(OpenAPI.Parameter.Array.self, forKey: .parameters) ?? [] get = try container.decodeIfPresent(OpenAPI.Operation.self, forKey: .get) diff --git a/Sources/OpenAPIKit/Request.swift b/Sources/OpenAPIKit/Request.swift index 7e7da04e7..8dd8b9a27 100644 --- a/Sources/OpenAPIKit/Request.swift +++ b/Sources/OpenAPIKit/Request.swift @@ -40,8 +40,7 @@ extension OpenAPI.Request: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try description.encodeIfNotNil(to: &container, forKey: .description) - + try container.encodeIfPresent(description, forKey: .description) try container.encode(content, forKey: .content) if required { @@ -56,9 +55,7 @@ extension OpenAPI.Request: Decodable { do { description = try container.decodeIfPresent(String.self, forKey: .description) - content = try container.decode(OpenAPI.Content.Map.self, forKey: .content) - required = try container.decodeIfPresent(Bool.self, forKey: .required) ?? false } catch let error as InconsistencyError { diff --git a/Sources/OpenAPIKit/Response.swift b/Sources/OpenAPIKit/Response.swift index 11f34d5f1..a677d5879 100644 --- a/Sources/OpenAPIKit/Response.swift +++ b/Sources/OpenAPIKit/Response.swift @@ -151,8 +151,7 @@ extension OpenAPI.Response: Encodable { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(description, forKey: .description) - - try headers.encodeIfNotNil(to: &container, forKey: .headers) + try container.encodeIfPresent(headers, forKey: .headers) if content.count > 0 { try container.encode(content, forKey: .content) @@ -166,9 +165,7 @@ extension OpenAPI.Response: Decodable { do { description = try container.decode(String.self, forKey: .description) - headers = try container.decodeIfPresent(OpenAPI.Header.Map.self, forKey: .headers) - content = try container.decodeIfPresent(OpenAPI.Content.Map.self, forKey: .content) ?? [:] } catch let error as InconsistencyError { diff --git a/Sources/OpenAPIKit/Schema Object/JSONSchemaFragment.swift b/Sources/OpenAPIKit/Schema Object/JSONSchemaFragment.swift index 91e65a6af..3fc9e1d04 100644 --- a/Sources/OpenAPIKit/Schema Object/JSONSchemaFragment.swift +++ b/Sources/OpenAPIKit/Schema Object/JSONSchemaFragment.swift @@ -358,17 +358,17 @@ extension JSONSchemaFragment: Encodable { private func encodeGeneralProperties(for type: JSONType?, to encoder: Encoder) throws { var container = encoder.container(keyedBy: GeneralCodingKeys.self) - try type.encodeIfNotNil(to: &container, forKey: .type) - try format.encodeIfNotNil(to: &container, forKey: .format) - try description.encodeIfNotNil(to: &container, forKey: .description) - try title.encodeIfNotNil(to: &container, forKey: .title) - try nullable.encodeIfNotNil(to: &container, forKey: .nullable) - try deprecated.encodeIfNotNil(to: &container, forKey: .deprecated) - try externalDocs.encodeIfNotNil(to: &container, forKey: .externalDocs) - try allowedValues.encodeIfNotNil(to: &container, forKey: .allowedValues) - try example.encodeIfNotNil(to: &container, forKey: .example) - try readOnly.encodeIfNotNil(to: &container, forKey: .readOnly) - try writeOnly.encodeIfNotNil(to: &container, forKey: .writeOnly) + try container.encodeIfPresent(type, forKey: .type) + try container.encodeIfPresent(format, forKey: .format) + try container.encodeIfPresent(description, forKey: .description) + try container.encodeIfPresent(title, forKey: .title) + try container.encodeIfPresent(nullable, forKey: .nullable) + try container.encodeIfPresent(deprecated, forKey: .deprecated) + try container.encodeIfPresent(externalDocs, forKey: .externalDocs) + try container.encodeIfPresent(allowedValues, forKey: .allowedValues) + try container.encodeIfPresent(example, forKey: .example) + try container.encodeIfPresent(readOnly, forKey: .readOnly) + try container.encodeIfPresent(writeOnly, forKey: .writeOnly) } public func encode(to encoder: Encoder) throws { @@ -382,47 +382,53 @@ extension JSONSchemaFragment: Encodable { try encodeGeneralProperties(for: .integer, to: encoder) var container = encoder.container(keyedBy: IntegerCodingKeys.self) - try integerContext.multipleOf.encodeIfNotNil(to: &container, forKey: .multipleOf) - try integerContext.maximum.encodeIfNotNil(to: &container, forKey: .maximum) - try integerContext.exclusiveMaximum.encodeIfNotNil(to: &container, forKey: .exclusiveMaximum) - try integerContext.minimum.encodeIfNotNil(to: &container, forKey: .minimum) - try integerContext.exclusiveMinimum.encodeIfNotNil(to: &container, forKey: .exclusiveMinimum) + + try container.encodeIfPresent(integerContext.multipleOf, forKey: .multipleOf) + try container.encodeIfPresent(integerContext.maximum, forKey: .maximum) + try container.encodeIfPresent(integerContext.exclusiveMaximum, forKey: .exclusiveMaximum) + try container.encodeIfPresent(integerContext.minimum, forKey: .minimum) + try container.encodeIfPresent(integerContext.exclusiveMinimum, forKey: .exclusiveMinimum) + case .number(_, let numericContext): try encodeGeneralProperties(for: .number, to: encoder) var container = encoder.container(keyedBy: NumericCodingKeys.self) - try numericContext.multipleOf.encodeIfNotNil(to: &container, forKey: .multipleOf) - try numericContext.maximum.encodeIfNotNil(to: &container, forKey: .maximum) - try numericContext.exclusiveMaximum.encodeIfNotNil(to: &container, forKey: .exclusiveMaximum) - try numericContext.minimum.encodeIfNotNil(to: &container, forKey: .minimum) - try numericContext.exclusiveMinimum.encodeIfNotNil(to: &container, forKey: .exclusiveMinimum) + + try container.encodeIfPresent(numericContext.multipleOf, forKey: .multipleOf) + try container.encodeIfPresent(numericContext.maximum, forKey: .maximum) + try container.encodeIfPresent(numericContext.exclusiveMaximum, forKey: .exclusiveMaximum) + try container.encodeIfPresent(numericContext.minimum, forKey: .minimum) + try container.encodeIfPresent(numericContext.exclusiveMinimum, forKey: .exclusiveMinimum) case .string(_, let stringContext): try encodeGeneralProperties(for: .string, to: encoder) var container = encoder.container(keyedBy: StringCodingKeys.self) - try stringContext.maxLength.encodeIfNotNil(to: &container, forKey: .maxLength) - try stringContext.minLength.encodeIfNotNil(to: &container, forKey: .minLength) - try stringContext.pattern.encodeIfNotNil(to: &container, forKey: .pattern) + + try container.encodeIfPresent(stringContext.maxLength, forKey: .maxLength) + try container.encodeIfPresent(stringContext.minLength, forKey: .minLength) + try container.encodeIfPresent(stringContext.pattern, forKey: .pattern) case .array(_, let arrayContext): try encodeGeneralProperties(for: .array, to: encoder) var container = encoder.container(keyedBy: ArrayCodingKeys.self) - try arrayContext.items.encodeIfNotNil(to: &container, forKey: .items) - try arrayContext.maxItems.encodeIfNotNil(to: &container, forKey: .maxItems) - try arrayContext.minItems.encodeIfNotNil(to: &container, forKey: .minItems) - try arrayContext.uniqueItems.encodeIfNotNil(to: &container, forKey: .uniqueItems) + + try container.encodeIfPresent(arrayContext.items, forKey: .items) + try container.encodeIfPresent(arrayContext.maxItems, forKey: .maxItems) + try container.encodeIfPresent(arrayContext.minItems, forKey: .minItems) + try container.encodeIfPresent(arrayContext.uniqueItems, forKey: . uniqueItems) case .object(_, let objectContext): try encodeGeneralProperties(for: .object, to: encoder) var container = encoder.container(keyedBy: ObjectCodingKeys.self) - try objectContext.maxProperties.encodeIfNotNil(to: &container, forKey: .maxProperties) - try objectContext.minProperties.encodeIfNotNil(to: &container, forKey: .minProperties) - try objectContext.properties.encodeIfNotNil(to: &container, forKey: .properties) - try objectContext.additionalProperties.encodeIfNotNil(to: &container, forKey: .additionalProperties) - try objectContext.required.encodeIfNotNil(to: &container, forKey: .required) + + try container.encodeIfPresent(objectContext.maxProperties, forKey: .maxProperties) + try container.encodeIfPresent(objectContext.minProperties, forKey: .minProperties) + try container.encodeIfPresent(objectContext.properties, forKey: .properties) + try container.encodeIfPresent(objectContext.additionalProperties, forKey: .additionalProperties) + try container.encodeIfPresent(objectContext.required, forKey: .required) } } } diff --git a/Sources/OpenAPIKit/Schema Object/SchemaObject.swift b/Sources/OpenAPIKit/Schema Object/SchemaObject.swift index ecd3170b0..58d31236b 100644 --- a/Sources/OpenAPIKit/Schema Object/SchemaObject.swift +++ b/Sources/OpenAPIKit/Schema Object/SchemaObject.swift @@ -832,19 +832,19 @@ extension JSONSchema: Encodable { var container = encoder.container(keyedBy: SubschemaCodingKeys.self) try container.encode(nodes, forKey: .allOf) - try discriminator.encodeIfNotNil(to: &container, forKey: .discriminator) + try container.encodeIfPresent(discriminator, forKey: .discriminator) case .one(of: let nodes, let discriminator): var container = encoder.container(keyedBy: SubschemaCodingKeys.self) try container.encode(nodes, forKey: .oneOf) - try discriminator.encodeIfNotNil(to: &container, forKey: .discriminator) + try container.encodeIfPresent(discriminator, forKey: .discriminator) case .any(of: let nodes, let discriminator): var container = encoder.container(keyedBy: SubschemaCodingKeys.self) try container.encode(nodes, forKey: .anyOf) - try discriminator.encodeIfNotNil(to: &container, forKey: .discriminator) + try container.encodeIfPresent(discriminator, forKey: .discriminator) case .not(let node): var container = encoder.container(keyedBy: SubschemaCodingKeys.self) diff --git a/Sources/OpenAPIKit/Schema Object/SchemaObjectContext.swift b/Sources/OpenAPIKit/Schema Object/SchemaObjectContext.swift index d22b621c0..b9de3805a 100644 --- a/Sources/OpenAPIKit/Schema Object/SchemaObjectContext.swift +++ b/Sources/OpenAPIKit/Schema Object/SchemaObjectContext.swift @@ -379,15 +379,11 @@ extension JSONSchema.Context: Encodable { try container.encode(format, forKey: .format) } - try allowedValues.encodeIfNotNil(to: &container, forKey: .allowedValues) - - try title.encodeIfNotNil(to: &container, forKey: .title) - - try description.encodeIfNotNil(to: &container, forKey: .description) - - try discriminator.encodeIfNotNil(to: &container, forKey: .discriminator) - - try externalDocs.encodeIfNotNil(to: &container, forKey: .externalDocs) + try container.encodeIfPresent(allowedValues, forKey: .allowedValues) + try container.encodeIfPresent(title, forKey: .title) + try container.encodeIfPresent(description, forKey: .description) + try container.encodeIfPresent(discriminator, forKey: .discriminator) + try container.encodeIfPresent(externalDocs, forKey: .externalDocs) // nullable is false if omitted if nullable { @@ -407,7 +403,7 @@ extension JSONSchema.Context: Encodable { try container.encode(deprecated, forKey: .deprecated) } - try example.encodeIfNotNil(to: &container, forKey: .example) + try container.encodeIfPresent(example, forKey: .example) } } @@ -424,17 +420,14 @@ extension JSONSchema.Context: Decodable { title = try container.decodeIfPresent(String.self, forKey: .title) description = try container.decodeIfPresent(String.self, forKey: .description) - discriminator = try container.decodeIfPresent(OpenAPI.Discriminator.self, forKey: .discriminator) - externalDocs = try container.decodeIfPresent(OpenAPI.ExternalDocumentation.self, forKey: .externalDocs) - allowedValues = try container.decodeIfPresent([AnyCodable].self, forKey: .allowedValues) - nullable = try container.decodeIfPresent(Bool.self, forKey: .nullable) ?? false let readOnly = try container.decodeIfPresent(Bool.self, forKey: .readOnly) ?? false let writeOnly = try container.decodeIfPresent(Bool.self, forKey: .writeOnly) ?? false + switch (readOnly, writeOnly) { case (false, false): permissions = .readWrite @@ -451,7 +444,6 @@ extension JSONSchema.Context: Decodable { } deprecated = try container.decodeIfPresent(Bool.self, forKey: .deprecated) ?? false - example = try container.decodeIfPresent(AnyCodable.self, forKey: .example) } } @@ -470,7 +462,7 @@ extension JSONSchema.NumericContext: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try multipleOf.encodeIfNotNil(to: &container, forKey: .multipleOf) + try container.encodeIfPresent(multipleOf, forKey: .multipleOf) if let max = maximum { try container.encode(max.value, forKey: .maximum) @@ -518,7 +510,7 @@ extension JSONSchema.IntegerContext: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try multipleOf.encodeIfNotNil(to: &container, forKey: .multipleOf) + try container.encodeIfPresent(multipleOf, forKey: .multipleOf) if let max = maximum { try container.encode(max.value, forKey: .maximum) @@ -587,13 +579,13 @@ extension JSONSchema.StringContext: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try maxLength.encodeIfNotNil(to: &container, forKey: .maxLength) + try container.encodeIfPresent(maxLength, forKey: .maxLength) if minLength > 0 { try container.encode(minLength, forKey: .minLength) } - try pattern.encodeIfNotNil(to: &container, forKey: .pattern) + try container.encodeIfPresent(pattern, forKey: .pattern) } } @@ -620,9 +612,8 @@ extension JSONSchema.ArrayContext: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try items.encodeIfNotNil(to: &container, forKey: .items) - - try maxItems.encodeIfNotNil(to: &container, forKey: .maxItems) + try container.encodeIfPresent(items, forKey: .items) + try container.encodeIfPresent(maxItems, forKey: .maxItems) if minItems > 0 { // omission is the same as 0 @@ -661,13 +652,13 @@ extension JSONSchema.ObjectContext: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try maxProperties.encodeIfNotNil(to: &container, forKey: .maxProperties) + try container.encodeIfPresent(maxProperties, forKey: .maxProperties) if properties.count > 0 { try container.encode(properties, forKey: .properties) } - try additionalProperties.encodeIfNotNil(to: &container, forKey: .additionalProperties) + try container.encodeIfPresent(additionalProperties, forKey: .additionalProperties) if !requiredProperties.isEmpty { try container.encode(requiredProperties, forKey: .required) diff --git a/Sources/OpenAPIKit/SecurityScheme.swift b/Sources/OpenAPIKit/SecurityScheme.swift index 335139551..f629a45af 100644 --- a/Sources/OpenAPIKit/SecurityScheme.swift +++ b/Sources/OpenAPIKit/SecurityScheme.swift @@ -79,7 +79,7 @@ extension OpenAPI.SecurityScheme: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(description, forKey: .description) switch type { case .apiKey(name: let name, location: let location): @@ -89,7 +89,7 @@ extension OpenAPI.SecurityScheme: Encodable { case .http(scheme: let scheme, bearerFormat: let bearerFormat): try container.encode(SecurityType.Name.http, forKey: .type) try container.encode(scheme, forKey: .scheme) - try bearerFormat.encodeIfNotNil(to: &container, forKey: .bearerFormat) + try container.encodeIfPresent(bearerFormat, forKey: .bearerFormat) case .openIdConnect(openIdConnectUrl: let url): try container.encode(SecurityType.Name.openIdConnect, forKey: .type) try container.encode(url, forKey: .openIdConnectUrl) diff --git a/Sources/OpenAPIKit/Server.swift b/Sources/OpenAPIKit/Server.swift index fa0b4c3c0..8ff0a6544 100644 --- a/Sources/OpenAPIKit/Server.swift +++ b/Sources/OpenAPIKit/Server.swift @@ -73,7 +73,7 @@ extension OpenAPI.Server: Encodable { try container.encode(url, forKey: .url) - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(description, forKey: .description) if variables.count > 0 { try container.encode(variables, forKey: .variables) @@ -147,7 +147,7 @@ extension OpenAPI.Server.Variable: Encodable { try container.encode(`default`, forKey: .default) - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(description, forKey: .description) } } diff --git a/Sources/OpenAPIKit/Tag.swift b/Sources/OpenAPIKit/Tag.swift index 2255393ba..c3c3bef5b 100644 --- a/Sources/OpenAPIKit/Tag.swift +++ b/Sources/OpenAPIKit/Tag.swift @@ -40,9 +40,9 @@ extension OpenAPI.Tag: Encodable { try container.encode(name, forKey: .name) - try description.encodeIfNotNil(to: &container, forKey: .description) + try container.encodeIfPresent(description, forKey: .description) - try externalDocs.encodeIfNotNil(to: &container, forKey: .externalDocs) + try container.encodeIfPresent(externalDocs, forKey: .externalDocs) } } diff --git a/Sources/OpenAPIKit/Utility/Encodable+EncodeIfNotNil.swift b/Sources/OpenAPIKit/Utility/Encodable+EncodeIfNotNil.swift deleted file mode 100644 index 63bcb50c3..000000000 --- a/Sources/OpenAPIKit/Utility/Encodable+EncodeIfNotNil.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// Encodable+EncodeIfNotNil.swift -// -// -// Created by Mathew Polzin on 11/3/19. -// - -extension Optional where Wrapped: Encodable { - /// Encode self if not `nil`, otherwise omit. - internal func encodeIfNotNil(to container: inout T, forKey key: T.Key) throws { - if self != nil { - try container.encode(self, forKey: key) - } - } -} diff --git a/Sources/OpenAPIKit/Utility/Optional+ZipWith.swift b/Sources/OpenAPIKit/Utility/Optional+ZipWith.swift deleted file mode 100644 index 597eef171..000000000 --- a/Sources/OpenAPIKit/Utility/Optional+ZipWith.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// Optional+ZipWith.swift -// OpenAPIKit -// -// Created by Mathew Polzin on 1/19/19. -// - -/// Zip two optionals together with the given operation performed on -/// the unwrapped contents. If either optional is nil, the zip -/// yields nil. -internal func zip(_ left: X?, _ right: Y?, with fn: (X, Y) -> Z) -> Z? { - return left.flatMap { lft in right.map { rght in fn(lft, rght) }} -} diff --git a/Sources/OpenAPIKit/XML.swift b/Sources/OpenAPIKit/XML.swift index 02fd7be90..1145e0645 100644 --- a/Sources/OpenAPIKit/XML.swift +++ b/Sources/OpenAPIKit/XML.swift @@ -49,14 +49,14 @@ extension OpenAPI.XML: Encodable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try name.encodeIfNotNil(to: &container, forKey: .name) - try namespace.encodeIfNotNil(to: &container, forKey: .namespace) - try prefix.encodeIfNotNil(to: &container, forKey: .prefix) + try container.encodeIfPresent(name, forKey: .name) + try container.encodeIfPresent(namespace, forKey: .namespace) + try container.encodeIfPresent(prefix, forKey: .prefix) if attribute { - try container.encode(attribute, forKey: .attribute) + try container.encode(true, forKey: .attribute) } if wrapped { - try container.encode(wrapped, forKey: .wrapped) + try container.encode(true, forKey: .wrapped) } } }