2022/01/10

引き続きRustをやっている。Microsoftが提供しているチュートリアルが終わった。

これが結構面白かった。Rustの言語仕様をざっと紹介しつつ、最後はCLIツールの作成までできる。課題ごとにソースコードが用意されていて、現状起きているコンパイルエラーを直していくのが大まかな学習の流れ。表示されるコンパイルエラーの内容と、コンパイルエラーの読み方を含めた解説をもとに進めていく形でとてもよい。

Rustはコンパイルエラーを通すまでは結構辛いものの、通った後の成果物としてのコードは見通しが良くなっているのがとても良い。というTwitterで何度か見かけたことがあるようなツイートと同じ気持ちになった。とても良い。


前回の日記でRustで何かモノを作ってみる題材としてGitHub Projectを操作するGitHub CLI extensionにしようかなと考えていた。Projectはbeta版であり、まだ公式のCLIでは提供されていない。自分はGitHub CLIをランチャーのように使っており、CLIからissueやPRをブラウザで開いたりしているので、同じようにprojectも操作したかったのがきっかけ。

何か他のチュートリアルをこなしてからモノを作り始めようかと思っていたが、やっていたmicrosoftのチュートリアルの成果物がCLIプログラムということもあり、それを参考にすればいけるだろうということで早速作り始めた。

microsoftのチュートリアルでも紹介されていたライブラリであるstructoptクレートがかなり優秀で、定義したstructをstructoptから継承させるだけでargsのバリデーションやusageなどのヘルプメッセージの生成が簡単にできる。さらにmain関数内でfrom_args関数を実行すれば型安全にstructのマッピングができてとても便利。

とりあえず自分が欲しい機能だけは実装できた。とはいえかなり小さい。
listとviewの二つのコマンドを提供し、listはまだproject idだけ、viewはブラウザで開くだけ。CLIで閲覧する機能はほぼない。

$ gh prj list
1
2 
$ gh prj view 1 --web
Opening "https://github.com/MH4GF/gh-prj/projects/1" in your browser.

しかしこの二つと、インクリメンタルサーチのようにフィルタリングできるツールのpecoを以下のように組み合わせると、listの結果をフィルタリングしつつ選択したidでブラウザで開けるようになる。

$ gh prj view $(gh prj list | peco| awk '{print $1}') --web
カレントディレクトリのリポジトリのプロジェクトに飛ぶ

とりあえず自分が使う分には十分で満足だが、gh issue view相当の機能は提供できるように拡充していきたい。まだバイナリのサポートもdarwinだけというのもある。
gh extensionの作成やRustのクロスコンパイルで結構詰まったりしたので、ある程度作り切ったらzennにまとめようと思う。

この記事が気に入ったらサポートをしてみませんか?