OpenAPITools / OpenAPITools/openapi-generator

[BUG] OpenAPI Generator Dart-Dio: Enum Discriminators in Discriminated Unions Cause Compilation Errors

Open
#21,570 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Bug Report Checklist
  • [ x] Have you provided a full/minimal spec to reproduce the issue?
  • [x ] Have you validated the input using an OpenAPI validator?
  • [x ] Have you tested with the latest master to confirm the issue still exists?
  • [x ] Have you searched for related issues/PRs?
  • [ x] What's the actual output vs expected output?
  • [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description

When using enum properties as discriminator fields in OpenAPI discriminated unions, the generated Dart code contains compilation errors:

  1. Incorrect discriminator assignment: The generator assigns enum values directly instead of string literals
  2. Missing string conversion: Enum discriminators are not properly converted to strings for comparison
  3. Type mismatch errors: Generated code expects string discriminators but receives enum values
openapi-generator version

OpenAPI generator version 7.12.0

OpenAPI declaration file content or url
# Problematic discriminated union using enum as discriminator
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'
      TYPE_C: '#/components/schemas/MerchantDetailsTypeCDto'
      TYPE_D: '#/components/schemas/MerchantDetailsTypeDDto'
      TYPE_E: '#/components/schemas/MerchantDetailsTypeEDto'
      TYPE_F: '#/components/schemas/MerchantDetailsTypeFDto'

# Another problematic discriminated union
QrCodeDto:
  type: object
  properties:
    type:
      $ref: '#/components/schemas/QrCodeTypeEnum'
    name:
      type: string
    code:
      type: string
    terminalId:
      format: int64
      type: integer
  required:
    - type
    - code
    - terminalId
  discriminator:
    propertyName: type
    mapping:
      STATIC_TYPE: '#/components/schemas/StaticQrCodeDto'
      DYNAMIC_TYPE: '#/components/schemas/DynamicQrCodeDto'

# The enum definitions that cause the problem
MerchantTypeEnum:
  type: string
  enum:
    - TYPE_A
    - TYPE_B
    - TYPE_C
    - TYPE_D
    - TYPE_E
    - TYPE_F

QrCodeTypeEnum:
  type: string
  enum:
    - DYNAMIC_TYPE
    - STATIC_TYPE
Generation Details

Generator: dart-dio with built_value serialization
OpenAPI Generator Version: 7.12.0
Input Spec: merchants-v2.1.yaml (contains the problematic discriminated unions)
Output Directory: ../ (relative to config directory)
Package Name: merchant_app
Discriminator Behavior: legacyDiscriminatorBehavior: false (uses new discriminator logic)
Enum Handling: enumUnknownDefaultCase: true (allows unknown enum values)

Steps to reproduce
  1. Use an OpenAPI spec with discriminated union using enum discriminator
  2. Generate Dart code using dart-dio template
  3. Attempt to compile generated code
  4. Observe compilation errors related to discriminator field assignments
Suggest a fix
  1. Fix the dart-dio Template Logic
    The core issue is in the dart-dio template's discriminator handling. The template should:
    Detect when discriminator properties are enum types (not just strings)
    Generate proper enum conversion code instead of direct assignment
    Handle null discriminator values gracefully

  2. Enhance Discriminator Property Type Detection
    The generator should:
    Parse the discriminator property's schema reference to determine if it's an enum
    Extract the enum class name from the schema reference
    Generate appropriate conversion logic based on the property type

  3. Add Configuration Option for Enum Discriminator Handling
    Introduce a new configuration option:

additionalProperties:
  enumDiscriminatorHandling: "auto"  # or "manual", "legacy"
  1. Improve Error Messages and Validation
    Add validation that:
    Warns when enum discriminators are detected but not properly handled
    Provides clear error messages about what needs to be fixed
    Suggests configuration changes to resolve issues

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the dart-dio template's discriminator handling and the enum schemas in the supplied OpenAPI YAML. Generate code with version 7.12.0, legacyDiscriminatorBehavior disabled, and enumUnknownDefaultCase enabled, then compile the output to reproduce the errors. Done means generated Dart for enum discriminated unions compiles and handles discriminator values correctly.

Written by the indexing model from the issue text.

Assessment

Tech stack
dart, java, openapi
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.