OpenAPI定義からSwift clientを作成する
パッと調べた限りだと以下の2つが選択肢になりそう。
apple製: https://github.com/apple/swift-openapi-generator
OpenAPITools/openapi-generator: https://github.com/OpenAPITools/openapi-generator
appleがswift専用に用意している方が色々かみ合わせが良いのではないかと考え、apple製の方を使ってみる。
ドキュメントがとても充実していそうなところはいい感じ。step by step tutorialはちょっと見づらい構成ではあったかも...
とは言っても一旦tutorialをやるのが良さうなのでやってみる。
swift runコマンドを初めて使ったが実行することには成功。(これはoptionalなので全然必要なかったかも)
tutorialを見ながら、いきなり自分のprojectに適用していく。
Sourcesディレクトリを作ってopenapi.jsonとopenapi-generator-config.yamlを作る。
openapi.jsonは事前に作っておいたサーバーの生成機能を使って生成。yamlが必要そうであればあとでjson→yamlする予定。openapi-generator-configのほうはこんな感じ。Java openapi generatorでいうところのbuild.gradleに書くような内容を記述するものだと理解。
generate:
- types
- client
namingStrategy: idiomaticプロジェクトツリートップ > Build PhasesからCompile Sourcesに先程の2ファイルを足す。Projectに存在していても自動でcompile対象になるわけではないらしい。それはそうか。
Package Dependenciesにhttps://github.com/apple/swift-openapi-generatorを入力してパッケージをダウンロード。Add to TargetはNoneになっているとよいらしい。
Targetに注意しつつ他のパッケージもダウンロードした後、Build PhasesでRun Build Tool Plug-insを更新する。
ここまでやってopenapiの定義にミスがなければビルドが成功する。
自分の場合はdescriptionの書き漏れなどのエラーが出ていたので修正した。
pluginによって生成されたコードは以下のディレクトリに配置されている。
request body構築の際など、clientや生成された型の情報が見たいときは参照すると良い。
デフォルトではXcodeから直接はコードジャンプできない模様だが、設定によって変えられるのだろうか?
~/Library/Developer/Xcode/DerivedData/<ProjectName>-<hash>/Build/Intermediates.noindex/
BuildToolPluginIntermediates/<TargetName>.output/<TargetName>/OpenAPIGenerator/GeneratedSources/