rust
cargo

cargo-strictでunwrap()だらけのコードにサヨナラ

書き捨てのRustコードがunwrap()だらけで、エラーが発生した時に辛い思いをしたことはありませんか?
私はあります。

そんなあなたに、cargo-strictを書いてみました。

https://github.com/hhatto/cargo-strict

使い方

インストール

$ cargo install --git https://github.com/hhatto/cargo-strict.git

実行

チェック対象は以下のようなファイルです。

simple.rs
fn main() {
    let s = "Hello world";  /* .unwrap() */
    let _ = s.find("wo").unwrap();
    // let _ = s.find("wo").unwrap();
    let ignore = "s.unwrap();";
}

実行してみます。

$ cargo strict
./simple.rs:2:24:     let _ = s.find("wo").unwrap();

unwrap()を使っているところを指摘してくれます。

コード修正まで行う

指摘するだけとかまどろっこしいことはいいので、expect()に変換してくれって方は--fixオプションをつけて、実行すればコード修正までおこなってくれます。

$ cargo strict --fix

変更前後のファイル差分は以下のようなかたちになります。
行ごとにmd5ハッシュで別々のエラーIDを付与してくれます。

$ git diff
diff --git a/simple.rs b/simple.rs
index e066898..dbe188b 100644
--- a/simple.rs
+++ b/simple.rs
@@ -1,6 +1,6 @@
 fn main() {
     let s = "Hello world";  /* .unwrap() */
-    let _ = s.find("wo").unwrap();
+    let _ = s.find("wo").expect("error-id:5cb0410ba34b040dbbde09dc1991685d");
     // let _ = s.find("wo").unwrap();
     let ignore = "s.unwrap();";
 }

これでどこでエラーが発生したかがすぐにわかるようになりました。