Skip to content

Commit b1ea0f3

Browse files
authored
[swift5] Make it possible to opt out of JSONEncodable conformance (#12664)
* Make it possible to opt out of JSONEncodable conformance JSONEncodable is not a native type and does not exist if only models are generated. * Match file indentation level
1 parent 012f908 commit b1ea0f3

4 files changed

Lines changed: 21 additions & 3 deletions

File tree

docs/generators/swift5.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
5353
|swiftUseApiNamespace|Flag to make all the API classes inner-class of {{projectName}}API| |null|
5454
|useBacktickEscapes|Escape reserved words using backticks (default: false)| |false|
5555
|useClasses|Use final classes for models instead of structs (default: false)| |false|
56+
|useJsonEncodable|Make models conform to JSONEncodable protocol (default: true)| |true|
5657
|useSPMFileStructure|Use SPM file structure and set the source path to Sources/{{projectName}} (default: false).| |null|
5758

5859
## IMPORT MAPPING

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
7070
public static final String USE_BACKTICK_ESCAPES = "useBacktickEscapes";
7171
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES = "generateModelAdditionalProperties";
7272
public static final String HASHABLE_MODELS = "hashableModels";
73+
public static final String USE_JSON_ENCODABLE = "useJsonEncodable";
7374
public static final String MAP_FILE_BINARY_TO_DATA = "mapFileBinaryToData";
7475
protected static final String LIBRARY_ALAMOFIRE = "alamofire";
7576
protected static final String LIBRARY_URLSESSION = "urlsession";
@@ -93,6 +94,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
9394
protected boolean useBacktickEscapes = false;
9495
protected boolean generateModelAdditionalProperties = true;
9596
protected boolean hashableModels = true;
97+
protected boolean useJsonEncodable = true;
9698
protected boolean mapFileBinaryToData = false;
9799
protected String[] responseAs = new String[0];
98100
protected String sourceFolder = swiftPackagePath;
@@ -299,6 +301,10 @@ public Swift5ClientCodegen() {
299301
"Make hashable models (default: true)")
300302
.defaultValue(Boolean.TRUE.toString()));
301303

304+
cliOptions.add(new CliOption(USE_JSON_ENCODABLE,
305+
"Make models conform to JSONEncodable protocol (default: true)")
306+
.defaultValue(Boolean.TRUE.toString()));
307+
302308
cliOptions.add(new CliOption(MAP_FILE_BINARY_TO_DATA,
303309
"[WARNING] This option will be removed and enabled by default in the future once we've enhanced the code to work with `Data` in all the different situations. Map File and Binary to Data (default: false)")
304310
.defaultValue(Boolean.FALSE.toString()));
@@ -497,6 +503,11 @@ public void processOpts() {
497503
}
498504
additionalProperties.put(HASHABLE_MODELS, hashableModels);
499505

506+
if (additionalProperties.containsKey(USE_JSON_ENCODABLE)) {
507+
setUseJsonEncodable(convertPropertyToBooleanAndWriteBack(USE_JSON_ENCODABLE));
508+
}
509+
additionalProperties.put(USE_JSON_ENCODABLE, useJsonEncodable);
510+
500511
if (additionalProperties.containsKey(MAP_FILE_BINARY_TO_DATA)) {
501512
setMapFileBinaryToData(convertPropertyToBooleanAndWriteBack(MAP_FILE_BINARY_TO_DATA));
502513
}
@@ -953,6 +964,10 @@ public void setHashableModels(boolean hashableModels) {
953964
this.hashableModels = hashableModels;
954965
}
955966

967+
public void setUseJsonEncodable(boolean useJsonEncodable) {
968+
this.useJsonEncodable = useJsonEncodable;
969+
}
970+
956971
@Override
957972
public String toEnumValue(String value, String datatype) {
958973
// for string, array of string
@@ -995,7 +1010,7 @@ public String toEnumVarName(String name, String datatype) {
9951010
if (getSymbolName(name) != null) {
9961011
return camelize(WordUtils.capitalizeFully(getSymbolName(name).toUpperCase(Locale.ROOT)), true);
9971012
}
998-
1013+
9991014
// Camelize only when we have a structure defined below
10001015
Boolean camelized = false;
10011016
if (name.matches("[A-Z][a-z0-9]+[a-zA-Z0-9]*")) {

modules/openapi-generator/src/main/resources/swift5/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}}}: {{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable, JSONEncodable{{/useVapor}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}} {
2-
{{/objcCompatible}}{{#objcCompatible}}@objc {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class {{classname}}: NSObject, Codable, JSONEncodable {
1+
{{^objcCompatible}}{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} {{#useClasses}}final class{{/useClasses}}{{^useClasses}}struct{{/useClasses}} {{{classname}}}: {{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable{{#useJsonEncodable}}, JSONEncodable{{/useJsonEncodable}}{{/useVapor}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}} {
2+
{{/objcCompatible}}{{#objcCompatible}}@objc {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class {{classname}}: NSObject, Codable{{#useJsonEncodable}}, JSONEncodable{{/useJsonEncodable}} {
33
{{/objcCompatible}}
44

55
{{#allVars}}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class Swift5OptionsProvider implements OptionsProvider {
5050
public static final String USE_BACKTICKS_ESCAPES_VALUE = "false";
5151
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE = "true";
5252
public static final String HASHABLE_MODELS_VALUE = "true";
53+
public static final String USE_JSON_ENCODABLE_VALUE = "true";
5354
public static final String ALLOW_UNICODE_IDENTIFIERS_VALUE = "false";
5455
public static final String PREPEND_FORM_OR_BODY_PARAMETERS_VALUE = "true";
5556
public static final String LIBRARY_VALUE = "alamofire";
@@ -98,6 +99,7 @@ public Map<String, String> createOptions() {
9899
.put(Swift5ClientCodegen.SWIFT_PACKAGE_PATH, SWIFT_PACKAGE_PATH_VALUE)
99100
.put(Swift5ClientCodegen.GENERATE_MODEL_ADDITIONAL_PROPERTIES, GENERATE_MODEL_ADDITIONAL_PROPERTIES_VALUE)
100101
.put(Swift5ClientCodegen.HASHABLE_MODELS, HASHABLE_MODELS_VALUE)
102+
.put(Swift5ClientCodegen.USE_JSON_ENCODABLE, USE_JSON_ENCODABLE_VALUE)
101103
.put(Swift5ClientCodegen.MAP_FILE_BINARY_TO_DATA, "false")
102104
.put(Swift5ClientCodegen.USE_CLASSES, "false")
103105
.put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, ENUM_UNKNOWN_DEFAULT_CASE_VALUE)

0 commit comments

Comments
 (0)