mizukmb/esa-nippou という CLI ツールを作りました。このツールは masutaka/github-nippou を参考に、 esa.io で今日作成した記事をマークダウン形式で標準出力します。
使い方は README.md を見ればわかるように書いたのでそちらを参照してください。ここでは、どうして Rust を選択したのかやつまづいたところについて書いていこうと思います。
どうして Rust を選択したのか
好みです。そもそも、前から Rust で何か開発したくて勉強会とかも行ったり、Rust のチュートリアルを途中までやったりしていて、そこで上記ツールを作成する際に使ってみようと思うに至りました。
CLI ツールであれば、書きなれた Ruby や Rust と同じくバイナリファイルにコンパイルできる Golang でも作れます。ただまあいい機会なので Rust で書いてみるかみたいなそんな気持ちでした。
Rust つまづきポイント
extern crate
意外と標準仕様で持ってない機能が多く、外部モジュールを使うことが多かったように思います。 json のパースも serde-rs/json を使ったりとそういうものなのかなあと思うことが多かったです。
外部モジュールを使ってつらかった点としては、戻り値が独自の型で返ってくるので他で使う時にプリミティブな型に変換に変換したり、関数の引数でもらう型を合わせたりする必要があって、慣れるまでは大変でした。
参照と借用
いわゆる初心者がつまづきやすく、 Rust の最も特徴的な機能と言われるところです。今でもよくわかってないので間違ったことを書いてるかもしれないです。
正直、コンパイラの言われるがままに &
をつけて通したりしてることも多かったのでだいぶ雰囲気で理解しているふしがありますね…。
str と String
Ruby での文字列の扱いに慣れてしまっていたので、終始ウゲーって言いながら書いてました。必要な時だけ &str
で扱えばいいかな…みたいな気持ちです。
構造体の要素を &str
で作ったら大変なことになって無理になったので String
に変更したりしています b2a9462
大量の unwrap()
事あるごとに .unwrap()
書いてて ??? ってなってました。 こことかすごい。
でもちゃんと作ると Result で返して受け取り側でちゃんとエラーハンドリングできるように…ってなるんだろうなあとか思ってました。まあしょうがないのかな。よくわからん。
まとめ
mizukmb/esa-nippou を Rust で書いてみました。 Rust なんもわからんから雰囲気だけわかるぐらいになった気がします。
Rust は言語仕様が厳しく、初心者のうちは一度でコンパイルが通ることは滅多にないので何度か諦めかけたこともありました。ただ、 esa-nippou をとりあえず形にしたいというモチベーションもあったので、そのお陰で放棄することなくひとまず作ることができました。
まだまだ機能も乏しく、例えば初期のセットアップを esa-nippou init
で済ませるようにしたり、 WIP 記事は含めないといったこともやりたいなと思ってます。設計もまだまだ適当なので、他のプロジェクトのレポジトリを参考にしつつ esa-nippou のコードも洗練させていきたいですね。