Help us understand the problem. What is going on with this article?

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

はじめに

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

dalance
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした