🦀

メッセージをお嬢様風にしてcommitしてくれるCLIツールを作った

に公開

ojosama-commit

始めまして。しぐまと申します。
こんなツイートを見かけました。

https://twitter.com/jiro_saburomaru/status/1538044512861585409?s=20&t=UlsquA4tbY5NdKZvFsTI1g

何か作ってみたくなりました。

ということで
今回は、Rustという言語の勉強がてら、指定した文字列をお嬢様風にしてcommitしてくれるCLIツールを作りました。
とはいうものの実際にお嬢様風に変換する処理はjiro4989さまのojosamaというものを叩いているだけです。
最近はリポジトリ全体を見直し、Rustらしい設計にリファクタリングしてコードの読みやすさと堅牢性を高めました。

GitHub

完成品のリンクです。
starしてもらえたらうれしいです!
https://github.com/Sigumaa/ojosama-commit

予告なしに非公開にする可能性があります。

使い方

インストール

リポジトリをクローンして、次のコマンドを実行してください。

$ cargo install --path .

コミット

$ ojo "コミットメッセージです!"
[hoge huga000] コミットメッセージですわ~~!
 file changed, insertions(+)

作るうえで大変だったこと

今回の完成品はコード自体は短いのですが、Rustでこのようなツールを作るのは初めてだったということもありところどころ詰まる箇所がありました。
その後、実運用を続けるうちに「もっとRustらしくできるのでは?」と思い、エラーハンドリングやHTTP処理を一新しました。

APIへのリクエストはreqwestを使っていますが、構造体をそのままシリアライズ/デシリアライズする形に整理しました。
HTTPの入力と出力を明示的な型で表現することで、キーのスペルミスやフォーマット変更にもすぐ気づけるようになりました。

#[derive(Serialize)]
struct OjosamaRequest<'a> {
    #[serde(rename = "Text")]
    text: &'a str,
}

#[derive(Deserialize)]
struct OjosamaResponse {
    #[serde(rename = "Result")]
    result: String,
}

let response = client
    .post(API_ENDPOINT)
    .json(&OjosamaRequest { text: message })
    .send()
    .await?
    .json::<OjosamaResponse>()
    .await?;

また、OjoError という列挙型を用意して Result<T, OjoError> で制御するようにしたため、
引数不足・APIエラー・gitコマンド失敗などのケースをきれいに分岐できるようになりました。
CLIが吐くメッセージもお嬢様口調のまま整えてあります。

最後に

簡単なプロジェクトかもしれませんが、結構勉強になり楽しかったです。
これからもRustでいろいろ作ってみたいと思いました。

PRお待ちしてます!
よろしくお願いします!

Discussion