Skip to content

Commit 1278085

Browse files
committed
Address review findings
1 parent 00184fd commit 1278085

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ public ScalaHttp4sClientCodegen() {
8888
SchemaSupportFeature.Polymorphism,
8989
SchemaSupportFeature.not
9090
)
91+
.includeSchemaSupportFeatures(
92+
SchemaSupportFeature.oneOf
93+
)
9194
.excludeParameterFeatures(
9295
ParameterFeature.Cookie,
9396
ParameterFeature.FormMultipart
@@ -390,8 +393,10 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
390393
Set<String> additionalImports = new HashSet<>();
391394
for (String childName : cModel.oneOf) {
392395
CodegenModel childModel = allModels.get(childName);
393-
if (childModel != null && oneOfMemberCount.getOrDefault(childName, 0) == 1) {
394-
// Mark for inlining (only used by this one parent)
396+
if (childModel != null
397+
&& (childModel.oneOf == null || childModel.oneOf.isEmpty())
398+
&& oneOfMemberCount.getOrDefault(childName, 0) == 1) {
399+
// Mark for inlining (only used by this one parent, and not itself a oneOf container)
395400
childModel.getVendorExtensions().put("x-isOneOfMember", true);
396401
childModel.getVendorExtensions().put("x-oneOfParent", cModel.classname);
397402
// Store parent's discriminator info for use in template
@@ -407,6 +412,20 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
407412
}
408413
}
409414

415+
// Create list of discriminator entries with class names and schema names
416+
// When discriminator has no explicit mapping, use schema name (not class name)
417+
List<Map<String, String>> discriminatorEntries = new ArrayList<>();
418+
for (String childName : cModel.oneOf) {
419+
CodegenModel childModel = allModels.get(childName);
420+
if (childModel != null) {
421+
Map<String, String> entry = new HashMap<>();
422+
entry.put("classname", childModel.classname);
423+
entry.put("schemaName", childModel.name);
424+
discriminatorEntries.add(entry);
425+
}
426+
}
427+
cModel.getVendorExtensions().put("x-discriminator-entries", discriminatorEntries);
428+
410429
// Decide between sealed trait (with inlined members) vs regular trait (edge cases)
411430
// Use sealed trait ONLY if ALL oneOf members can be inlined
412431
// If some are inlined and some aren't (mixed case), use regular trait

modules/openapi-generator/src/main/resources/scala-http4s/model.mustache

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ object {{classname}} {
4343
{{^vendorExtensions.x-use-discr-mapping}}
4444
// with discriminator, no mapping
4545
given encoder{{classname}}: Encoder[{{classname}}] = Encoder.instance {
46-
{{#oneOf}}
47-
case obj: {{.}} => obj.asJson.mapObject(("{{discriminator.propertyName}}" -> "{{.}}".asJson) +: _)
48-
{{/oneOf}}
46+
{{#vendorExtensions.x-discriminator-entries}}
47+
case obj: {{classname}} => obj.asJson.mapObject(("{{discriminator.propertyName}}" -> "{{schemaName}}".asJson) +: _)
48+
{{/vendorExtensions.x-discriminator-entries}}
4949
}
5050

5151
given decoder{{classname}}: Decoder[{{classname}}] = Decoder.instance { cursor =>
5252
cursor.downField("{{discriminator.propertyName}}").as[String].flatMap {
53-
{{#oneOf}}
54-
case "{{.}}" => cursor.as[{{.}}]
55-
{{/oneOf}}
53+
{{#vendorExtensions.x-discriminator-entries}}
54+
case "{{schemaName}}" => cursor.as[{{classname}}]
55+
{{/vendorExtensions.x-discriminator-entries}}
5656
case discriminatorValue =>
5757
Left(DecodingFailure(s"Unknown discriminator value: $discriminatorValue", cursor.history))
5858
}
@@ -109,14 +109,14 @@ object {{classname}} {
109109
// with discriminator, no mapping
110110
given encoder{{classname}}: Encoder[{{classname}}] = Encoder.instance {
111111
{{#vendorExtensions.x-oneOfMembers}}
112-
case obj: {{classname}} => obj.asJson.mapObject(("{{vendorExtensions.x-parentDiscriminatorName}}" -> "{{classname}}".asJson) +: _)
112+
case obj: {{classname}} => obj.asJson.mapObject(("{{vendorExtensions.x-parentDiscriminatorName}}" -> "{{name}}".asJson) +: _)
113113
{{/vendorExtensions.x-oneOfMembers}}
114114
}
115115

116116
given decoder{{classname}}: Decoder[{{classname}}] = Decoder.instance { cursor =>
117117
cursor.downField("{{discriminator.propertyName}}").as[String].flatMap {
118118
{{#vendorExtensions.x-oneOfMembers}}
119-
case "{{classname}}" => cursor.as[{{classname}}]
119+
case "{{name}}" => cursor.as[{{classname}}]
120120
{{/vendorExtensions.x-oneOfMembers}}
121121
case discriminatorValue =>
122122
Left(DecodingFailure(s"Unknown discriminator value: $discriminatorValue", cursor.history))

0 commit comments

Comments
 (0)