imgurian

Rustの勉強に、Imgur APIのクライアントライブラリを書いてみている。

Imgurは画像共有と画像投稿ができるソーシャルコミュニティサービス。2020年末頃から、このウェブサイトの画像配信にもImgurを使わせてもらっている。良いサービスだと思うけど、画像に直アクセスするときに (CDNの挙動のせいか) エラー画面が出たり出なかったりと怪しい挙動になることが多く、不安になることもある……が、応援したいサービスではある。

前にRustで書いたのはこのサイトの実装で、これはライブラリではなくアプリケーションという性格のプログラムであったから、今度はライブラリを書いてみよう、というモチベーションである。Imgur APIを選んだのは、RESTfulなWeb APIのクライアントであれば別言語で実装したことがあるし、加えてGitHub Pagesから直接配信している既存の画像をImgurに移行したいというモチベーションもあったため。


個別のエンドポイントについて、それぞれ実行可能なサンプルコードをリポジトリ上に用意するようにしていたが、これってもう実行可能なバイナリCrateとして実装した方が利用者も助かって良くないか、と思ってそのようにした。Linux, Mac, Windows向けにそれぞれ実行可能なバイナリをクロスコンパイルして配布している。

$ imgurian --help
imgurian 0.3.0
Imgur API client.

USAGE:
    imgurian <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    delete-image                Delete an image.
    favorite-image              Favorite an image.
    generate-access-token       Generates an access token from given refresh token.
    get-account                 Get information about an account.
    get-account-image           Get information about an image of an account.
    get-account-images-count    Get the total number of images associated with the account.
    get-image                   Get information about an image.
    help                        Prints this message or the help of the given subcommand(s)
    list-account-images         List account images.
    update-image                Update information about an image.
    upload-image                Upload a new image.

OpenAPI Specificationに従った形式の情報からコードを生成するツール、openapi-generator。これの生成するRustのコードと、今回自分が書いたコードを見比べてみるという活動を進めた。

段々とboilerplateなコードを書く機会が増えてきており、未対応なImgur APIのエンドポイントもまだまだあるということで、可能ならOpenAPIのような仕様データから生成する方が良いかもしれない、と思い始めている。また、自分の書いたコードが自動生成されたそれとどの程度乖離しているものなのか、単純に興味があるというのも、これを調べてみた理由の一つ。

印象を述べると、自動生成されたものとあまり違いが見られなくて少し驚いた。一方で、よく出来ているなと思う幾つかの点を自動生成されたコードから発見できたので、学習としては収穫があった。openapi-generatorで生成したコードが上手く活用できるようであれば、これを利用する形に切り替えるのもありかもしれない。Rust版には認証認可周りで少し未対応な部分があったり、ファイルアップロード等の特殊なエンドポイントにおいて追加対応が必要であったりもするので、その辺と上手く折り合いを付けられるのかどうかを今後調べていく必要がある。


Imgur APIのための非公式なOpenAPI specを管理するリポジトリと、これを利用して生成したRust向けクライアントライブラリを管理するリポジトリを用意した。

まだOpenAPI specの定義が充実していないが、少なくともデータモデルの方だけでも利用価値のあるものにはなっている。副産物として、常に最新版のOpenAPI specからswagger-uiでドキュメントページをつくり、GitHub Pagesにホストしてもらうという仕組みがつくれた。これも意外と便利だ。

今後、imgurianの内部実装をimgur_openapi crateを利用したものに徐々に変更していきたい。