🐛

enum型のフィールドにdefaultを使うとopenapi-generatorのバグでDartクライアントを生成できない

2024/01/10に公開

環境

npm -v "@openapitools/openapi-generator-cli"
> 10.2.4

fvm flutter --version
Flutter 3.13.8 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6c4930c4ac (3 months ago) • 2023-10-18 10:57:55 -0500
Engine • revision 767d8c75e8
Tools • Dart 3.1.4 • DevTools 2.25.0

概要

FastAPIからOASを生成

原因となったモデルのコード

class UserGameHistoryBase(TimestampMixin, SQLModel):
    status: UserGameStatusEnum = Field(
        UserGameStatusEnum.WAITING,
        description="ユーザーのゲームの状態",
    )

生成したOAS

        status:
          allOf:
          - $ref: '#/components/schemas/UserGameStatusEnum'
          description: "\u30E6\u30FC\u30B6\u30FC\u306E\u30B2\u30FC\u30E0\u306E\u72B6\
            \u614B"
          default: 1 # <- ここがダメ

OASからDart Clientを生成したところビルドエラー

npx @openapitools/openapi-generator-cli generate \
		-i docs/openapi/openapi.yaml \
		-g dart-dio \
		-o frontend/api \
		--global-property models,modelDocs=false,modelTests=false,apis,apiDocs=false,apiTests=false,supportingFiles

fvm flutter clean && fvm flutter pub get && \
fvm flutter pub run build_runner build --delete-conflicting-outputs

Expected an identifier
簡素なエラーメッセージで原因を特定するのに時間がかかりました。

This builder requires Dart inputs without syntax errors.
However, package:openapi/src/model/xxx.dart (or an existing part) contains the following errors.
xxx.dart:45:24: Expected an identifier.

Try fixing the errors and re-running the build.

[INFO] Running build completed, took 4.3s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 39ms

[SEVERE] Failed after 4.4s
make: *** [gen-oas-client] Error 1

openapi-generatorのバグのようです。
https://github.com/OpenAPITools/openapi-generator/issues/4300

修正後

class UserGameHistoryBase(TimestampMixin, SQLModel):
    status: UserGameStatusEnum = Field(
	...,
        description="ユーザーのゲームの状態",
    )

生成したOAS

        status:
          allOf:
          - $ref: '#/components/schemas/UserGameStatusEnum'
          description: "\u30E6\u30FC\u30B6\u30FC\u306E\u30B2\u30FC\u30E0\u306E\u72B6\
            \u614B"

$refを使ったenum型フィールドに defaultを指定するとバグになるようです。

Discussion