clientを自動生成できるProgenitorを試すこんにちは、お手伝いの大櫛です。RustにもOpenAPI関連のツールやライブラリなどが増えてきており、開発需要の高まりを感じます。Rustに限った話ではないですが、OpenAPIとのインテグレーションパターンについては、サーバーのアプリケーションコードからドキュメントを生成するもの、ドキュメントからクライアントを生成するものなどなど色々なバリエーションが存在します。clientを自動生成」してくれるProgenitorをお試ししてみます。Computerにより公開されています。crateだけです(2023年11月18日時点)。serverを構築できるDropshotの印象も強いです:github.comただし、progenitorにもDropshotにも共通して言えることですが、これらcrateはあくまでOxide社内での利用が第一となっており、第三者による利用が最優先に捉えられているわけではないことに注意が必要です*1。Progenitorはマクロやbuild.rsなどを通して利用できます。今回はサポートされているユースケースそれぞれを簡単に見ていきます。appをベースに、utoipaによるOpenAPIドキュメントの公開と生成を行っています。UI、Redoc、そしてRapiDocによるドキュメント公開を簡単に行えています。認証が必要マクロによる生成このセクションでのサンプルコードはこちらです:github.comセットアップの手間という観点ではマクロによる生成が最もステップ少なく利用できます。エラーを追跡しづらい点には注意が必要です。ミニマムな例だと、以下のように利用できます。メソッドとして各APIコールが自動で実装されます。使われているようです。経由でビルド時に生成する方法です。用意すれば、あとはほとんどマクロのときと同じように使用できます。参照していますが、出力ディレクトリを調整すれば生成ファイルをバージョン管理下に置くこともできます。commandによる生成との大きな差分として、ファイルとして出力するか、別crateとして出力したいかという部分があります。この辺りはユースケースに合わせて選択していくことになりそうです。0.1.0結構細かく指定できる他、後述する自動生成の挙動についてのオプションもあります。生成されるので、生成されたcrateをimportすれば他の方法と同様に利用・実装できます。生成方法を問わず、自動生成の挙動についてinterfaceとtagを指定できます。2パターンを選択できます。デフォルトはpositionalで、先に例示したコードではこちらを使用しています。APIコールするメソッドを直接生やす形になります。各APIコールのためのメソッドを呼び出すとそれぞれの構造体が返ってくる形となります。paramsを渡すときに便利です。todosについてqueryをoptionalとし、渡されなかった場合には全件返すような修正を加えたとします。.await?明示的にすべて指定した方が分かりやすいという見方もありそうですが、利用者側でこれら実装パターンを選択できる余地があるのはメリットです。APIの数や形などでもどちらがいいか変わってきそうですね。