LoginSignup
28
22

More than 3 years have passed since last update.

Rustのエラーライブラリ利用状況を調べてみた

Posted at

はじめに

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あたりでしょうか。

28
22
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
22