Skip to content

Commit f950ac9

Browse files
authored
[swift][client] make QueryStringEncodable return any Sendable (#21142)
* [swift][client] make QueryStringEncodable return any Sendable * [swift][client] rename QueryStringEncodable to ParameterConvertible * [swift][client] update migration docs * Revert "[swift][client] update migration docs" This reverts commit 00a4905. * [swift][client] rename QueryStringEncodable to ParameterConvertible
1 parent 44c342b commit f950ac9

File tree

472 files changed

+1499
-1569
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

472 files changed

+1499
-1569
lines changed

docs/generators/swift6.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5656
|useBacktickEscapes|Escape reserved words using backticks (default: false)| |false|
5757
|useClasses|Use final classes for models instead of structs (default: false)| |false|
5858
|useCustomDateWithoutTime|Uses a custom type to decode and encode dates without time information to support OpenAPIs date format (default: false)| |false|
59-
|useJsonEncodable|Make models conform to JSONEncodable protocol (default: true)| |true|
59+
|useParameterConvertible|Make models conform to ParameterConvertible protocol (default: true)| |true|
6060
|useSPMFileStructure|Use SPM file structure and set the source path to Sources/{{projectName}} (default: true).| |null|
6161
|validatable|Make validation rules and validator for model properties (default: true)| |true|
6262

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/Swift6ClientCodegen.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
7272
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES = "generateModelAdditionalProperties";
7373
public static final String HASHABLE_MODELS = "hashableModels";
7474
public static final String IDENTIFIABLE_MODELS = "identifiableModels";
75-
public static final String USE_JSON_ENCODABLE = "useJsonEncodable";
75+
public static final String USE_PARAMETER_CONVERTIBLE = "useParameterConvertible";
7676
public static final String MAP_FILE_BINARY_TO_DATA = "mapFileBinaryToData";
7777
public static final String USE_CUSTOM_DATE_WITHOUT_TIME = "useCustomDateWithoutTime";
7878
public static final String VALIDATABLE = "validatable";
@@ -115,7 +115,7 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
115115
@Setter
116116
protected boolean identifiableModels = true;
117117
@Setter
118-
protected boolean useJsonEncodable = true;
118+
protected boolean useParameterConvertible = true;
119119
@Getter
120120
@Setter
121121
protected boolean mapFileBinaryToData = false;
@@ -335,8 +335,8 @@ public Swift6ClientCodegen() {
335335
"Make models conform to Identifiable when an id is present (default: true)")
336336
.defaultValue(Boolean.TRUE.toString()));
337337

338-
cliOptions.add(new CliOption(USE_JSON_ENCODABLE,
339-
"Make models conform to JSONEncodable protocol (default: true)")
338+
cliOptions.add(new CliOption(USE_PARAMETER_CONVERTIBLE,
339+
"Make models conform to ParameterConvertible protocol (default: true)")
340340
.defaultValue(Boolean.TRUE.toString()));
341341

342342
cliOptions.add(new CliOption(MAP_FILE_BINARY_TO_DATA,
@@ -560,10 +560,10 @@ public void processOpts() {
560560
}
561561
additionalProperties.put(IDENTIFIABLE_MODELS, identifiableModels);
562562

563-
if (additionalProperties.containsKey(USE_JSON_ENCODABLE)) {
564-
setUseJsonEncodable(convertPropertyToBooleanAndWriteBack(USE_JSON_ENCODABLE));
563+
if (additionalProperties.containsKey(USE_PARAMETER_CONVERTIBLE)) {
564+
setUseParameterConvertible(convertPropertyToBooleanAndWriteBack(USE_PARAMETER_CONVERTIBLE));
565565
}
566-
additionalProperties.put(USE_JSON_ENCODABLE, useJsonEncodable);
566+
additionalProperties.put(USE_PARAMETER_CONVERTIBLE, useParameterConvertible);
567567

568568
if (additionalProperties.containsKey(MAP_FILE_BINARY_TO_DATA)) {
569569
setMapFileBinaryToData(convertPropertyToBooleanAndWriteBack(MAP_FILE_BINARY_TO_DATA));

modules/openapi-generator/src/main/resources/swift6/Extensions.mustache

Lines changed: 41 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,103 +11,98 @@ import FoundationNetworking
1111
@preconcurrency import PromiseKit{{/usePromiseKit}}{{#useVapor}}
1212
import Vapor{{/useVapor}}{{^useVapor}}
1313

14-
extension QueryStringEncodable {
15-
@_disfavoredOverload
16-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
14+
extension Bool: ParameterConvertible {
15+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
1716
}
1817

19-
extension Bool: QueryStringEncodable {
20-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
18+
extension Float: ParameterConvertible {
19+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
2120
}
2221

23-
extension Float: QueryStringEncodable {
24-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
22+
extension Int: ParameterConvertible {
23+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
2524
}
2625

27-
extension Int: QueryStringEncodable {
28-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
26+
extension Int32: ParameterConvertible {
27+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
2928
}
3029

31-
extension Int32: QueryStringEncodable {
32-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
30+
extension Int64: ParameterConvertible {
31+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
3332
}
3433

35-
extension Int64: QueryStringEncodable {
36-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
34+
extension Double: ParameterConvertible {
35+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
3736
}
3837

39-
extension Double: QueryStringEncodable {
40-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
38+
extension Decimal: ParameterConvertible {
39+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
4140
}
4241

43-
extension Decimal: QueryStringEncodable {
44-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
42+
extension String: ParameterConvertible {
43+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
4544
}
4645

47-
extension String: QueryStringEncodable {
48-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
46+
extension URL: ParameterConvertible {
47+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
4948
}
5049

51-
extension URL: QueryStringEncodable {
52-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
50+
extension UUID: ParameterConvertible {
51+
func asParameter(codableHelper: CodableHelper) -> any Sendable { self }
5352
}
5453

55-
extension UUID: QueryStringEncodable {
56-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: self) }
54+
extension RawRepresentable where RawValue: ParameterConvertible, RawValue: Sendable {
55+
func asParameter(codableHelper: CodableHelper) -> any Sendable { return self.rawValue }
5756
}
5857

59-
extension RawRepresentable where RawValue: QueryStringEncodable {
60-
func encodeToQueryString(codableHelper: CodableHelper) -> String { String(describing: rawValue) }
61-
}
62-
63-
private func encodeIfPossible<T>(_ object: T, codableHelper: CodableHelper) -> String {
64-
if let encodableObject = object as? QueryStringEncodable {
65-
return encodableObject.encodeToQueryString(codableHelper: codableHelper)
58+
private func encodeIfPossible<T: Sendable>(_ object: T, codableHelper: CodableHelper) -> any Sendable {
59+
if let encodableObject = object as? ParameterConvertible {
60+
return encodableObject.asParameter(codableHelper: codableHelper)
6661
} else {
67-
return String(describing: object)
62+
return object
6863
}
6964
}
7065

71-
extension Array {
72-
func encodeToQueryString(codableHelper: CodableHelper) -> [String] {
66+
extension Array where Element: Sendable {
67+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
7368
return self.map { encodeIfPossible($0, codableHelper: codableHelper) }
7469
}
7570
}
7671

77-
extension Set {
78-
func encodeToQueryString(codableHelper: CodableHelper) -> [String] {
79-
return Array(self).encodeToQueryString(codableHelper: codableHelper)
72+
extension Set where Element: Sendable {
73+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
74+
return Array(self).asParameter(codableHelper: codableHelper)
8075
}
8176
}
8277

83-
extension Dictionary {
84-
func encodeToQueryString(codableHelper: CodableHelper) -> [Key: String] {
85-
var dictionary = [Key: String]()
78+
extension Dictionary where Key: Sendable, Value: Sendable {
79+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
80+
var dictionary = [Key: any Sendable]()
8681
for (key, value) in self {
8782
dictionary[key] = encodeIfPossible(value, codableHelper: codableHelper)
8883
}
8984
return dictionary
9085
}
9186
}
9287

93-
extension Data: QueryStringEncodable {
94-
func encodeToQueryString(codableHelper: CodableHelper) -> String {
88+
extension Data: ParameterConvertible {
89+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
9590
return self.base64EncodedString(options: Data.Base64EncodingOptions())
9691
}
9792
}
9893

99-
extension Date: QueryStringEncodable {
100-
func encodeToQueryString(codableHelper: CodableHelper) -> String {
94+
extension Date: ParameterConvertible {
95+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
10196
return codableHelper.dateFormatter.string(from: self)
10297
}
10398
}
10499

105-
extension QueryStringEncodable where Self: Encodable {
106-
func encodeToQueryString(codableHelper: CodableHelper) -> String {
100+
extension ParameterConvertible where Self: Encodable {
101+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
107102
guard let data = try? codableHelper.jsonEncoder.encode(self) else {
108103
fatalError("Could not encode to json: \(self)")
109104
}
110-
return data.encodeToQueryString(codableHelper: codableHelper)
105+
return data.asParameter(codableHelper: codableHelper)
111106
}
112107
}{{/useVapor}}{{#generateModelAdditionalProperties}}
113108

modules/openapi-generator/src/main/resources/swift6/Models.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import FoundationNetworking
1010
#endif{{#useAlamofire}}
1111
import Alamofire{{/useAlamofire}}
1212

13-
protocol QueryStringEncodable {
14-
func encodeToQueryString(codableHelper: CodableHelper) -> String
13+
protocol ParameterConvertible {
14+
func asParameter(codableHelper: CodableHelper) -> any Sendable
1515
}
1616

1717
/// An enum where the last case value can be used as a default catch-all.

modules/openapi-generator/src/main/resources/swift6/OpenAPIDateWithoutTime.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ import Foundation
7676
}
7777
}
7878

79-
extension OpenAPIDateWithoutTime: QueryStringEncodable {
80-
func encodeToQueryString(codableHelper: CodableHelper) -> String {
79+
extension OpenAPIDateWithoutTime: ParameterConvertible {
80+
func asParameter(codableHelper: CodableHelper) -> any Sendable {
8181
return OpenISO8601DateFormatter.withoutTime.string(from: self.normalizedWrappedDate())
8282
}
8383
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
"{{baseName}}": {{#isQueryParam}}(wrappedValue: {{/isQueryParam}}{{paramName}}{{^required}}?{{/required}}.encodeToQueryString(codableHelper: apiConfiguration.codableHelper){{#isQueryParam}}, isExplode: {{isExplode}}){{/isQueryParam}}
1+
"{{baseName}}": {{#isQueryParam}}(wrappedValue: {{/isQueryParam}}{{paramName}}{{^required}}?{{/required}}.asParameter(codableHelper: apiConfiguration.codableHelper){{#isQueryParam}}, isExplode: {{isExplode}}){{/isQueryParam}}

modules/openapi-generator/src/main/resources/swift6/modelEnum.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{classname}}: {{dataType}}, Sendable, {{#useVapor}}Content, Hashable{{/useVapor}}{{^useVapor}}Codable{{^isString}}{{^isInteger}}{{^isFloat}}{{^isDouble}}{{#useJsonEncodable}}, QueryStringEncodable{{/useJsonEncodable}}{{/isDouble}}{{/isFloat}}{{/isInteger}}{{/isString}}{{/useVapor}}, CaseIterable{{#enumUnknownDefaultCase}}{{#isInteger}}, CaseIterableDefaultsLast{{/isInteger}}{{#isFloat}}, CaseIterableDefaultsLast{{/isFloat}}{{#isDouble}}, CaseIterableDefaultsLast{{/isDouble}}{{#isString}}, CaseIterableDefaultsLast{{/isString}}{{/enumUnknownDefaultCase}} {
1+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{classname}}: {{dataType}}, Sendable, {{#useVapor}}Content, Hashable{{/useVapor}}{{^useVapor}}Codable{{^isString}}{{^isInteger}}{{^isFloat}}{{^isDouble}}{{#useParameterConvertible}}, ParameterConvertible{{/useParameterConvertible}}{{/isDouble}}{{/isFloat}}{{/isInteger}}{{/isString}}{{/useVapor}}, CaseIterable{{#enumUnknownDefaultCase}}{{#isInteger}}, CaseIterableDefaultsLast{{/isInteger}}{{#isFloat}}, CaseIterableDefaultsLast{{/isFloat}}{{#isDouble}}, CaseIterableDefaultsLast{{/isDouble}}{{#isString}}, CaseIterableDefaultsLast{{/isString}}{{/enumUnknownDefaultCase}} {
22
{{#allowableValues}}
33
{{#enumVars}}
44
case {{{name}}} = {{{value}}}

modules/openapi-generator/src/main/resources/swift6/modelInlineEnumDeclaration.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{enumName}}: {{^isContainer}}{{dataType}}{{/isContainer}}{{#isContainer}}String{{/isContainer}}, Sendable, {{#useVapor}}Content, Hashable{{/useVapor}}{{^useVapor}}Codable{{^isContainer}}{{^isString}}{{^isInteger}}{{^isFloat}}{{^isDouble}}{{#useJsonEncodable}}, QueryStringEncodable{{/useJsonEncodable}}{{/isDouble}}{{/isFloat}}{{/isInteger}}{{/isString}}{{/isContainer}}{{/useVapor}}, CaseIterable{{#enumUnknownDefaultCase}}{{#isInteger}}, CaseIterableDefaultsLast{{/isInteger}}{{#isFloat}}, CaseIterableDefaultsLast{{/isFloat}}{{#isDouble}}, CaseIterableDefaultsLast{{/isDouble}}{{#isString}}, CaseIterableDefaultsLast{{/isString}}{{#isContainer}}, CaseIterableDefaultsLast{{/isContainer}}{{/enumUnknownDefaultCase}} {
1+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{enumName}}: {{^isContainer}}{{dataType}}{{/isContainer}}{{#isContainer}}String{{/isContainer}}, Sendable, {{#useVapor}}Content, Hashable{{/useVapor}}{{^useVapor}}Codable{{^isContainer}}{{^isString}}{{^isInteger}}{{^isFloat}}{{^isDouble}}{{#useParameterConvertible}}, ParameterConvertible{{/useParameterConvertible}}{{/isDouble}}{{/isFloat}}{{/isInteger}}{{/isString}}{{/isContainer}}{{/useVapor}}, CaseIterable{{#enumUnknownDefaultCase}}{{#isInteger}}, CaseIterableDefaultsLast{{/isInteger}}{{#isFloat}}, CaseIterableDefaultsLast{{/isFloat}}{{#isDouble}}, CaseIterableDefaultsLast{{/isDouble}}{{#isString}}, CaseIterableDefaultsLast{{/isString}}{{#isContainer}}, CaseIterableDefaultsLast{{/isContainer}}{{/enumUnknownDefaultCase}} {
22
{{#allowableValues}}
33
{{#enumVars}}
44
case {{{name}}} = {{{value}}}

modules/openapi-generator/src/main/resources/swift6/modelObject.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{{^objcCompatible}}{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} {{#useClasses}}final class{{/useClasses}}{{^useClasses}}struct{{/useClasses}} {{{classname}}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}@unchecked Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable{{#useJsonEncodable}}, QueryStringEncodable{{/useJsonEncodable}}{{/useVapor}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}} {
2-
{{/objcCompatible}}{{#objcCompatible}}@objcMembers {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class {{classname}}: NSObject, Codable{{#useJsonEncodable}}, QueryStringEncodable{{/useJsonEncodable}} {
1+
{{^objcCompatible}}{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} {{#useClasses}}final class{{/useClasses}}{{^useClasses}}struct{{/useClasses}} {{{classname}}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}@unchecked Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable{{#useParameterConvertible}}, ParameterConvertible{{/useParameterConvertible}}{{/useVapor}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}} {
2+
{{/objcCompatible}}{{#objcCompatible}}@objcMembers {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class {{classname}}: NSObject, Codable{{#useParameterConvertible}}, ParameterConvertible{{/useParameterConvertible}} {
33
{{/objcCompatible}}
44

55
{{#allVars}}

modules/openapi-generator/src/main/resources/swift6/modelOneOf.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{classname}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable{{#useJsonEncodable}}, QueryStringEncodable{{/useJsonEncodable}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}}{{/useVapor}} {
1+
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{classname}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable{{#useParameterConvertible}}, ParameterConvertible{{/useParameterConvertible}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}}{{/useVapor}} {
22
{{#oneOf}}
33
case type{{#transformArrayType}}{{.}}{{/transformArrayType}}({{.}})
44
{{/oneOf}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/options/Swift6ClientCodegenOptionsProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class Swift6ClientCodegenOptionsProvider implements OptionsProvider {
4848
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE = "true";
4949
public static final String HASHABLE_MODELS_VALUE = "true";
5050
public static final String IDENTIFIABLE_MODELS_VALUE = "true";
51-
public static final String USE_JSON_ENCODABLE_VALUE = "true";
51+
public static final String USE_PARAMETER_CONVERTIBLE_VALUE = "true";
5252
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
5353
public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true";
5454
public static final String LIBRARY_VALUE = "alamofire";
@@ -99,7 +99,7 @@ public Map<String, String> createOptions() {
9999
GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE)
100100
.put(Swift6ClientCodegen.HASHABLE_MODELS, HASHABLE_MODELS_VALUE)
101101
.put(Swift6ClientCodegen.IDENTIFIABLE_MODELS, IDENTIFIABLE_MODELS_VALUE)
102-
.put(Swift6ClientCodegen.USE_JSON_ENCODABLE, USE_JSON_ENCODABLE_VALUE)
102+
.put(Swift6ClientCodegen.USE_PARAMETER_CONVERTIBLE, USE_PARAMETER_CONVERTIBLE_VALUE)
103103
.put(Swift6ClientCodegen.MAP_FILE_BINARY_TO_DATA, "false")
104104
.put(Swift6ClientCodegen.USE_CUSTOM_DATE_WITHOUT_TIME, "false")
105105
.put(Swift6ClientCodegen.VALIDATABLE, "true")

0 commit comments

Comments
 (0)