はじめに
Rustのエラーライブラリはこれまで
-
std::error::Error
をマクロで使いやすくするerror-chain -
std::error::Error
をあきらめて、独自のFail
トレイトを提供するfailure - failureの知見を元に
std::error::Error
を再設計 RFC 2504
という変遷を経てきました。
(このあたりの詳細は"Rust のエラーまわりの変遷"が詳しいです)
元々は新しくなったstd::error::Error
に対応してfailure 0.2が出る予定だったのですが、あまり進んでいないように見えます。
post failureを謳うクレートもいくつか出てきており、エラーライブラリの選定は難しくなりつつある気がしています。
そこで各エラーライブラリの利用状況を調べてみました。
折角なので、今後も半年に一度くらいは調べていきたいと思います(覚えていれば…)。
調査方法
crates.ioのAPIを叩くcrates_io_apiというクレートがあったので以下のようなコードを書きました。
use crates_io_api::SyncClient;
fn main() {
let client = SyncClient::new();
let all = client.all_crates(Some(String::from("error")));
let mut result = Vec::new();
if let Ok(all) = all {
for c in all {
let name = c.name;
let update = c.updated_at;
if let Some(d) = c.description {
if d.to_lowercase().contains("error") {
let rev = client.crate_reverse_dependencies(&name);
if let Ok(rev) = rev {
let total = rev.meta.total;
if total != 0 {
result.push((total, name, update));
}
}
}
}
}
}
result.sort_by_key(|x| x.0);
result.reverse();
println!("|crate|dependents|updated_at|");
println!("|-----|----------|----------|");
for (total, name, update) in result {
println!("|{}|{}|{}|", name, total, update.format("%Y-%m-%d"));
}
}
all_crates
メソッドでcrates.ioページ上部の検索フィールドから検索したときに出てくるクレート一覧が得られます。
ただし、この検索はREADME.mdなども対象としているようで、error
のような一般的な単語を入れてしまうとかなり過剰に出てきます。
そのため、ここではCargo.tomlのdescription
フィールドにerror
が含まれるものだけを対象としました。
さらにcrate_reverse_dependencies
メソッドでそのクレートに依存関係を持っているクレート一覧が得られます。
crate_reverse_dependencies
で得られるクレートの個数が、そのクレートの利用数ということになります。
結果(2019/10/1)
10以上のクレートから使われているエラーライブラリは以下の通りです。
(上記のプログラムを実行するともう少し出てきますが、エラーライブラリでないものは手動で除去しました)
crate | dependents | created_at | updated_at |
---|---|---|---|
failure | 1885 | 2017-10-08 | 2019-01-02 |
error-chain | 669 | 2016-04-29 | 2019-05-10 |
quick-error | 242 | 2015-09-09 | 2018-05-26 |
snafu | 50 | 2019-01-28 | 2019-08-26 |
err-derive | 37 | 2018-12-24 | 2019-09-26 |
derive-error | 28 | 2017-01-15 | 2017-10-04 |
simple-error | 20 | 2016-03-24 | 2019-07-03 |
custom_error | 18 | 2018-11-01 | 2019-07-30 |
common_failures | 11 | 2017-12-24 | 2018-05-15 |
トップ3は昔からあるやつですね。
最近(std::error::Error
再設計後くらい)出てきて使われているのはsnafu/err-derive/custom_errorあたりでしょうか。