[swift6] Add Identifiable conformance to supported models (#20166)

This commit is contained in:
Lennard Sprong 2024-11-24 23:35:17 +01:00 committed by GitHub
parent 8ce332a540
commit 4c5a57fe7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
61 changed files with 196 additions and 3 deletions

View File

@ -6,6 +6,7 @@ generateAliasAsModel: true
additionalProperties:
responseAs: ObjcBlock
podAuthors: ""
identifiableModels: false
podSummary: PetstoreClient
objcCompatible: true
projectName: PetstoreClient

View File

@ -28,6 +28,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
|generateModelAdditionalProperties|Generate model additional properties (default: true)| |true|
|hashableModels|Make hashable models (default: true)| |true|
|hideGenerationTimestamp|Hides the generation timestamp when files are generated.| |true|
|identifiableModels|Make models conform to Identifiable when an id is present (default: true)| |true|
|legacyDiscriminatorBehavior|Set to false for generators with better support for discriminators. (Python, Java, Go, PowerShell, C# have this enabled by default).|<dl><dt>**true**</dt><dd>The mapping in the discriminator includes descendent schemas that allOf inherit from self and the discriminator mapping schemas in the OAS document.</dd><dt>**false**</dt><dd>The mapping in the discriminator includes any descendent schemas that allOf inherit from self, any oneOf schemas, any anyOf schemas, any x-discriminator-values, and the discriminator mapping schemas in the OAS document AND Codegen validates that oneOf and anyOf schemas contain the required discriminator and throws an error if the discriminator is missing.</dd></dl>|true|
|library|Library template (sub-template) to use|<dl><dt>**urlsession**</dt><dd>[DEFAULT] HTTP client: URLSession</dd><dt>**alamofire**</dt><dd>HTTP client: Alamofire</dd><dt>**vapor**</dt><dd>HTTP client: Vapor</dd></dl>|urlsession|
|mapFileBinaryToData|Map File and Binary to Data (default: false)| |false|

View File

@ -70,6 +70,7 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
public static final String USE_BACKTICK_ESCAPES = "useBacktickEscapes";
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES = "generateModelAdditionalProperties";
public static final String HASHABLE_MODELS = "hashableModels";
public static final String IDENTIFIABLE_MODELS = "identifiableModels";
public static final String USE_JSON_ENCODABLE = "useJsonEncodable";
public static final String MAP_FILE_BINARY_TO_DATA = "mapFileBinaryToData";
public static final String USE_CUSTOM_DATE_WITHOUT_TIME = "useCustomDateWithoutTime";
@ -98,6 +99,7 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
@Setter protected boolean useBacktickEscapes = false;
@Setter protected boolean generateModelAdditionalProperties = true;
@Setter protected boolean hashableModels = true;
@Setter protected boolean identifiableModels = true;
@Setter protected boolean useJsonEncodable = true;
@Getter @Setter protected boolean mapFileBinaryToData = false;
@Setter protected boolean useCustomDateWithoutTime = false;
@ -307,6 +309,10 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
"Make hashable models (default: true)")
.defaultValue(Boolean.TRUE.toString()));
cliOptions.add(new CliOption(IDENTIFIABLE_MODELS,
"Make models conform to Identifiable when an id is present (default: true)")
.defaultValue(Boolean.TRUE.toString()));
cliOptions.add(new CliOption(USE_JSON_ENCODABLE,
"Make models conform to JSONEncodable protocol (default: true)")
.defaultValue(Boolean.TRUE.toString()));
@ -527,6 +533,11 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
}
additionalProperties.put(HASHABLE_MODELS, hashableModels);
if (additionalProperties.containsKey(IDENTIFIABLE_MODELS)) {
setIdentifiableModels(convertPropertyToBooleanAndWriteBack(IDENTIFIABLE_MODELS));
}
additionalProperties.put(IDENTIFIABLE_MODELS, identifiableModels);
if (additionalProperties.containsKey(USE_JSON_ENCODABLE)) {
setUseJsonEncodable(convertPropertyToBooleanAndWriteBack(USE_JSON_ENCODABLE));
}
@ -973,6 +984,15 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
if (hashableModels) {
codegenModel.vendorExtensions.put("x-swift-hashable", true);
}
if (identifiableModels && !codegenModel.vendorExtensions.containsKey("x-swift-identifiable")) {
for (CodegenProperty cp : codegenModel.getVars()) {
if (!cp.getBaseName().equals("id")) continue;
if (cp.isString || cp.isUuid || cp.isInteger || cp.isLong) {
codegenModel.vendorExtensions.put("x-swift-identifiable", true);
break;
}
}
}
return codegenModel;
}

View File

@ -24,4 +24,7 @@ extension {{projectName}}API {
{{> modelObject}}{{/isEnum}}{{/isArray}}{{/vendorExtensions.x-is-one-of-interface}}{{/model}}{{/models}}
{{#swiftUseApiNamespace}}
}
{{/swiftUseApiNamespace}}
{{/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}}

View File

@ -48,6 +48,7 @@ public class Swift6ClientCodegenOptionsProvider implements OptionsProvider {
public static final String USE_BACKTICKS_ESCAPES_VALUE = "false";
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE = "true";
public static final String HASHABLE_MODELS_VALUE = "true";
public static final String IDENTIFIABLE_MODELS_VALUE = "true";
public static final String USE_JSON_ENCODABLE_VALUE = "true";
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true";
@ -98,15 +99,16 @@ public class Swift6ClientCodegenOptionsProvider implements OptionsProvider {
.put(Swift6ClientCodegen.GENERATE_MODEL_ADDITIONAL_PROPERTIES,
GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE)
.put(Swift6ClientCodegen.HASHABLE_MODELS, HASHABLE_MODELS_VALUE)
.put(Swift6ClientCodegen.IDENTIFIABLE_MODELS, IDENTIFIABLE_MODELS_VALUE)
.put(Swift6ClientCodegen.USE_JSON_ENCODABLE, USE_JSON_ENCODABLE_VALUE)
.put(Swift6ClientCodegen.MAP_FILE_BINARY_TO_DATA, "false")
.put(Swift6ClientCodegen.USE_CUSTOM_DATE_WITHOUT_TIME, "false")
.put(Swift6ClientCodegen.VALIDATABLE, "true")
.put(Swift6ClientCodegen.ONE_OF_UNKNOWN_DEFAULT_CASE, "false")
.put(Swift6ClientCodegen.USE_CLASSES, "false")
.put(Swift6ClientCodegen.API_STATIC_METHOD,
.put(Swift6ClientCodegen.API_STATIC_METHOD,
API_STATIC_METHOD_VALUE)
.put(Swift6ClientCodegen.COMBINE_DEFERRED,
.put(Swift6ClientCodegen.COMBINE_DEFERRED,
COMBINE_DEFERRED_VALUE)
.put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, ENUM_UNKNOWN_DEFAULT_CASE_VALUE)
.build();

View File

@ -53,6 +53,7 @@ public class Swift6ClientCodegenOptionsTest extends AbstractOptionsTest {
verify(clientCodegen).setGenerateModelAdditionalProperties(
Boolean.parseBoolean(Swift6ClientCodegenOptionsProvider.GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE));
verify(clientCodegen).setHashableModels(Boolean.parseBoolean(Swift6ClientCodegenOptionsProvider.HASHABLE_MODELS_VALUE));
verify(clientCodegen).setIdentifiableModels(Boolean.parseBoolean(Swift6ClientCodegenOptionsProvider.IDENTIFIABLE_MODELS_VALUE));
verify(clientCodegen)
.setEnumUnknownDefaultCase(Boolean.parseBoolean(Swift6ClientCodegenOptionsProvider.ENUM_UNKNOWN_DEFAULT_CASE_VALUE));
verify(clientCodegen).setApiStaticMethod(Boolean.parseBoolean(Swift6ClientCodegenOptionsProvider.API_STATIC_METHOD_VALUE));

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -54,3 +54,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ internal struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -54,3 +54,6 @@ internal struct Order: Sendable, Codable, JSONEncodable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -57,3 +57,6 @@ internal struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ internal struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ internal struct User: Sendable, Codable, JSONEncodable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Category: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -53,3 +53,6 @@ public struct Order: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct Pet: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -31,3 +31,6 @@ public struct Tag: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -56,3 +56,6 @@ public struct User: Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}

View File

@ -49,3 +49,6 @@ public final class Category: @unchecked Sendable, Codable, JSONEncodable, Hashab
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension PetstoreClientAPI.Category: Identifiable {}

View File

@ -79,3 +79,6 @@ public final class Order: @unchecked Sendable, Codable, JSONEncodable, Hashable
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension PetstoreClientAPI.Order: Identifiable {}

View File

@ -82,3 +82,6 @@ public final class Pet: @unchecked Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension PetstoreClientAPI.Pet: Identifiable {}

View File

@ -49,3 +49,6 @@ public final class Tag: @unchecked Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension PetstoreClientAPI.Tag: Identifiable {}

View File

@ -86,3 +86,6 @@ public final class User: @unchecked Sendable, Codable, JSONEncodable, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension PetstoreClientAPI.User: Identifiable {}

View File

@ -44,3 +44,6 @@ public final class Category: Content, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Category: Identifiable {}

View File

@ -74,3 +74,6 @@ public final class Order: Content, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Order: Identifiable {}

View File

@ -75,3 +75,6 @@ public final class Pet: Content, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Pet: Identifiable {}

View File

@ -44,3 +44,6 @@ public final class Tag: Content, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension Tag: Identifiable {}

View File

@ -81,3 +81,6 @@ public final class User: Content, Hashable {
}
}
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
extension User: Identifiable {}