diff --git a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class.mustache b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class.mustache index 7a9ee688596b..6468fe6964f3 100644 --- a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class.mustache +++ b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class.mustache @@ -13,9 +13,8 @@ part '{{classFilename}}.g.dart'; } {{#discriminator}}{{#hasDiscriminatorWithNonEmptyMapping}} {{>serialization/built_value/class_discriminator}} - {{/hasDiscriminatorWithNonEmptyMapping}}{{/discriminator}} {{>serialization/built_value/class_serializer}}{{#vendorExtensions.x-is-parent}} {{>serialization/built_value/class_concrete}}{{/vendorExtensions.x-is-parent}} -{{>serialization/built_value/class_inline_enums}} \ No newline at end of file +{{>serialization/built_value/class_inline_enums}} diff --git a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_discriminator.mustache b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_discriminator.mustache index f867345883b1..b82ddbf4818d 100644 --- a/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_discriminator.mustache +++ b/modules/openapi-generator/src/main/resources/dart/libraries/dio/serialization/built_value/class_discriminator.mustache @@ -1,3 +1,4 @@ +{{^discriminator.isEnum}} extension {{classname}}DiscriminatorExt on {{classname}} { String? get discriminatorValue { {{#mappedModels}} @@ -17,4 +18,27 @@ extension {{classname}}BuilderDiscriminatorExt on {{classname}}Builder { {{/mappedModels}} return null; } -} \ No newline at end of file +} +{{/discriminator.isEnum}} +{{#discriminator.isEnum}} +extension {{classname}}DiscriminatorExt on {{classname}} { + {{discriminator.propertyType}} get discriminatorValue { + {{#mappedModels}} + if (this is {{modelName}}) { + return {{discriminator.propertyType}}.valueOf(r'{{mappingName}}'); + } + {{/mappedModels}} + throw UnsupportedError('Invalid discriminator value for {{classname}}'); + } +} +extension {{classname}}BuilderDiscriminatorExt on {{classname}}Builder { + {{discriminator.propertyType}} get discriminatorValue { + {{#mappedModels}} + if (this is {{modelName}}Builder) { + return {{discriminator.propertyType}}.valueOf(r'{{mappingName}}'); + } + {{/mappedModels}} + throw UnsupportedError('Invalid discriminator value for {{classname}}Builder'); + } +} +{{/discriminator.isEnum}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/dart/dio/DartDioClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/dart/dio/DartDioClientCodegenTest.java index 90017530fb85..07b0bf40e3a4 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/dart/dio/DartDioClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/dart/dio/DartDioClientCodegenTest.java @@ -115,4 +115,32 @@ public void verifyDartDioGeneratorRuns() throws IOException { TestUtils.ensureContainsFile(files, output, "README.md"); TestUtils.ensureContainsFile(files, output, "lib/src/api.dart"); } + + @Test + public void verifyEnumDiscriminatorUsesEnumType() throws IOException { + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("dart-dio") + .setInputSpec("src/test/resources/3_0/dart-dio/enum-discriminator.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")) + .addAdditionalProperty(CodegenConstants.SERIALIZATION_LIBRARY, DartDioClientCodegen.SERIALIZATION_LIBRARY_BUILT_VALUE) + .addAdditionalProperty(CodegenConstants.LEGACY_DISCRIMINATOR_BEHAVIOR, false) + .addAdditionalProperty(CodegenConstants.ENUM_UNKNOWN_DEFAULT_CASE, true); + + ClientOptInput opts = configurator.toClientOptInput(); + + Generator generator = new DefaultGenerator().opts(opts); + List files = generator.generate(); + files.forEach(File::deleteOnExit); + + File modelFile = new File(output, "lib/src/model/merchant_details_dto.dart"); + TestUtils.ensureContainsFile(files, output, "lib/src/model/merchant_details_dto.dart"); + + String contents = Files.readString(modelFile.toPath(), StandardCharsets.UTF_8); + Assert.assertTrue(contents.contains("MerchantTypeEnum get discriminatorValue")); + Assert.assertTrue(contents.contains("MerchantTypeEnum.valueOf(r'TYPE_A')")); + Assert.assertFalse(contents.contains("String? get discriminatorValue")); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/dart-dio/enum-discriminator.yaml b/modules/openapi-generator/src/test/resources/3_0/dart-dio/enum-discriminator.yaml new file mode 100644 index 000000000000..dc67ef2fc280 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/dart-dio/enum-discriminator.yaml @@ -0,0 +1,51 @@ +openapi: 3.0.3 +info: + title: Dart Dio Enum Discriminator + version: 1.0.0 +paths: + /merchant: + get: + responses: + '200': + description: ok + content: + application/json: + schema: + $ref: '#/components/schemas/MerchantDetailsDto' +components: + schemas: + MerchantDetailsDto: + type: object + properties: + uuid: + type: string + format: uuid + merchantType: + $ref: '#/components/schemas/MerchantTypeEnum' + required: + - uuid + - merchantType + discriminator: + propertyName: merchantType + mapping: + TYPE_A: '#/components/schemas/MerchantDetailsTypeADto' + TYPE_B: '#/components/schemas/MerchantDetailsTypeBDto' + MerchantDetailsTypeADto: + allOf: + - $ref: '#/components/schemas/MerchantDetailsDto' + - type: object + properties: + aField: + type: string + MerchantDetailsTypeBDto: + allOf: + - $ref: '#/components/schemas/MerchantDetailsDto' + - type: object + properties: + bField: + type: string + MerchantTypeEnum: + type: string + enum: + - TYPE_A + - TYPE_B diff --git a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart index 31b61361de5e..d4206a9229ac 100644 --- a/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart +++ b/samples/openapi3/client/petstore/dart-dio/oneof_polymorphism_and_inheritance/lib/src/model/fruit.dart @@ -46,25 +46,25 @@ abstract class Fruit implements Built { } extension FruitDiscriminatorExt on Fruit { - String? get discriminatorValue { + FruitType get discriminatorValue { if (this is Apple) { - return r'APPLE'; + return FruitType.valueOf(r'APPLE'); } if (this is Banana) { - return r'BANANA'; + return FruitType.valueOf(r'BANANA'); } - return null; + throw UnsupportedError('Invalid discriminator value for Fruit'); } } extension FruitBuilderDiscriminatorExt on FruitBuilder { - String? get discriminatorValue { + FruitType get discriminatorValue { if (this is AppleBuilder) { - return r'APPLE'; + return FruitType.valueOf(r'APPLE'); } if (this is BananaBuilder) { - return r'BANANA'; + return FruitType.valueOf(r'BANANA'); } - return null; + throw UnsupportedError('Invalid discriminator value for FruitBuilder'); } }