Skip to content

Commit 9b9f05e

Browse files
committed
fix: use oneOf mapping to map discriminator values to types
1 parent 4437a9e commit 9b9f05e

3 files changed

Lines changed: 212 additions & 183 deletions

File tree

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

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,27 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
279279
childModel.getVendorExtensions().put("x-isOneOfMember", true);
280280
childModel.getVendorExtensions().put("x-oneOfParent", cModel.classname);
281281

282-
// Remove discriminator field from child if parent has discriminator
283-
// (circe-generic-extras adds it automatically)
282+
// Add discriminator mapping value if present
284283
if (cModel.discriminator != null) {
285284
String discriminatorName = cModel.discriminator.getPropertyName();
285+
286+
// Find the mapping value for this child model
287+
String discriminatorValue = null;
288+
if (cModel.discriminator.getMappedModels() != null) {
289+
for (CodegenDiscriminator.MappedModel mappedModel : cModel.discriminator.getMappedModels()) {
290+
if (mappedModel.getModelName().equals(childName)) {
291+
discriminatorValue = mappedModel.getMappingName();
292+
break;
293+
}
294+
}
295+
}
296+
297+
if (discriminatorValue != null) {
298+
childModel.getVendorExtensions().put("x-discriminator-value", discriminatorValue);
299+
}
300+
301+
// Remove discriminator field from child
302+
// (circe-generic-extras adds it automatically)
286303
childModel.vars.removeIf(prop -> prop.baseName.equals(discriminatorName));
287304
childModel.allVars.removeIf(prop -> prop.baseName.equals(discriminatorName));
288305
childModel.requiredVars.removeIf(prop -> prop.baseName.equals(discriminatorName));

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,13 @@ object {{classname}} {
103103
import io.circe.generic.auto._
104104

105105
private implicit val config: Configuration = Configuration.default.withDiscriminator("{{discriminator.propertyName}}")
106-
106+
.copy(
107+
transformConstructorNames = {
108+
{{#vendorExtensions.x-oneOfMembers}}
109+
case "{{classname}}" => "{{vendorExtensions.x-discriminator-value}}"
110+
{{/vendorExtensions.x-oneOfMembers}}
111+
}
112+
)
107113
implicit val encoder: Encoder[{{classname}}] = deriveConfiguredEncoder
108114
implicit val decoder: Decoder[{{classname}}] = deriveConfiguredDecoder
109115
{{/vendorExtensions.x-use-discr}}

0 commit comments

Comments
 (0)