Skip to content

Commit f409bf1

Browse files
Erokhaerokha
andauthored
add oneOf-default-case option for swift5 (#19094)
Co-authored-by: erokha <dev@erokha.com>
1 parent 1cdd7b7 commit f409bf1

4 files changed

Lines changed: 24 additions & 0 deletions

File tree

docs/generators/swift5.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ These options may be applied as additional-properties (cli) or configOptions (pl
3232
|mapFileBinaryToData|[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)| |false|
3333
|nonPublicApi|Generates code with reduced access modifiers; allows embedding elsewhere without exposing non-public API calls to consumers.(default: false)| |null|
3434
|objcCompatible|Add additional properties and methods for Objective-C compatibility (default: false)| |null|
35+
|oneOfUnknownDefaultCase|Add unknownDefault case to oneOf enum (default: false)| |false|
3536
|podAuthors|Authors used for Podspec| |null|
3637
|podDescription|Description used for Podspec| |null|
3738
|podDocumentationURL|Documentation URL used for Podspec| |null|

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
6767
public static final String LENIENT_TYPE_CAST = "lenientTypeCast";
6868
public static final String USE_SPM_FILE_STRUCTURE = "useSPMFileStructure";
6969
public static final String SWIFT_PACKAGE_PATH = "swiftPackagePath";
70+
public static final String ONE_OF_UNKNOWN_DEFAULT_CASE = "oneOfUnknownDefaultCase";
7071
public static final String USE_CLASSES = "useClasses";
7172
public static final String USE_BACKTICK_ESCAPES = "useBacktickEscapes";
7273
public static final String GENERATE_MODEL_ADDITIONAL_PROPERTIES = "generateModelAdditionalProperties";
@@ -92,6 +93,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
9293
@Setter protected boolean swiftUseApiNamespace = false;
9394
@Setter protected boolean useSPMFileStructure = false;
9495
@Setter protected String swiftPackagePath = "Classes" + File.separator + "OpenAPIs";
96+
@Setter protected boolean oneOfUnknownDefaultCase = false;
9597
@Setter protected boolean useClasses = false;
9698
@Setter protected boolean useBacktickEscapes = false;
9799
@Setter protected boolean generateModelAdditionalProperties = true;
@@ -292,6 +294,9 @@ public Swift5ClientCodegen() {
292294
cliOptions.add(new CliOption(GENERATE_MODEL_ADDITIONAL_PROPERTIES,
293295
"Generate model additional properties (default: true)")
294296
.defaultValue(Boolean.TRUE.toString()));
297+
cliOptions.add(new CliOption(ONE_OF_UNKNOWN_DEFAULT_CASE,
298+
"Add unknownDefault case to oneOf enum (default: false)")
299+
.defaultValue(Boolean.FALSE.toString()));
295300

296301
cliOptions.add(new CliOption(CodegenConstants.API_NAME_PREFIX, CodegenConstants.API_NAME_PREFIX_DESC));
297302
cliOptions.add(new CliOption(USE_SPM_FILE_STRUCTURE, "Use SPM file structure"
@@ -532,6 +537,11 @@ public void processOpts() {
532537
typeMapping.put("date", "Date");
533538
}
534539

540+
if (additionalProperties.containsKey(ONE_OF_UNKNOWN_DEFAULT_CASE)) {
541+
setOneOfUnknownDefaultCase(convertPropertyToBooleanAndWriteBack(ONE_OF_UNKNOWN_DEFAULT_CASE));
542+
}
543+
additionalProperties.put(ONE_OF_UNKNOWN_DEFAULT_CASE, oneOfUnknownDefaultCase);
544+
535545
if (additionalProperties.containsKey(USE_CLASSES)) {
536546
setUseClasses(convertPropertyToBooleanAndWriteBack(USE_CLASSES));
537547
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
{{#oneOf}}
33
case type{{.}}({{.}})
44
{{/oneOf}}
5+
{{#oneOfUnknownDefaultCase}}
6+
case unknownDefault
7+
{{/oneOfUnknownDefaultCase}}
58

69
public func encode(to encoder: Encoder) throws {
710
var container = encoder.singleValueContainer()
@@ -10,6 +13,10 @@
1013
case .type{{.}}(let value):
1114
try container.encode(value)
1215
{{/oneOf}}
16+
{{#oneOfUnknownDefaultCase}}
17+
case unknownDefault(let type):
18+
try container.encodeNil()
19+
{{/oneOfUnknownDefaultCase}}
1320
}
1421
}
1522

@@ -25,7 +32,12 @@
2532
self = .type{{.}}(value)
2633
{{/oneOf}}
2734
} else {
35+
{{#oneOfUnknownDefaultCase}}
36+
self = .unknownDefault
37+
{{/oneOfUnknownDefaultCase}}
38+
{{^oneOfUnknownDefaultCase}}
2839
throw DecodingError.typeMismatch(Self.Type.self, .init(codingPath: decoder.codingPath, debugDescription: "Unable to decode instance of {{classname}}"))
40+
{{/oneOfUnknownDefaultCase}}
2941
}
3042
}
3143
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public Map<String, String> createOptions() {
100100
.put(Swift5ClientCodegen.MAP_FILE_BINARY_TO_DATA, "false")
101101
.put(Swift5ClientCodegen.USE_CUSTOM_DATE_WITHOUT_TIME, "false")
102102
.put(Swift5ClientCodegen.VALIDATABLE, "true")
103+
.put(Swift5ClientCodegen.ONE_OF_UNKNOWN_DEFAULT_CASE, "false")
103104
.put(Swift5ClientCodegen.USE_CLASSES, "false")
104105
.put(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, ENUM_UNKNOWN_DEFAULT_CASE_VALUE)
105106
.build();

0 commit comments

Comments
 (0)