thiserror

thiserror クレートは、エラー型を定義する際の定型的なコードを避けるのに役立つマクロを提供します。From<T>Display、および Error トレイトの実装を支援する derive マクロを提供します。

// 著作権 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::io::Read;
use std::{fs, io};
use thiserror::Error;

#[derive(Debug, Error)]
enum ReadUsernameError {
    #[error("I/O error: {0}")]
    IoError(#[from] io::Error),
    #[error("Found no username in {0}")]
    EmptyUsername(String),
}

fn read_username(path: &str) -> Result<String, ReadUsernameError> {
    let mut username = String::with_capacity(100);
    fs::File::open(path)?.read_to_string(&mut username)?;
    if username.is_empty() {
        return Err(ReadUsernameError::EmptyUsername(String::from(path)));
    }
    Ok(username)
}

fn main() {
    //fs::write("config.dat", "").unwrap();
    match read_username("config.dat") {
        Ok(username) => println!("Username: {username}"),
        Err(err) => println!("Error: {err}"),
    }
}
  • Error derive マクロは thiserror によって提供されており、コンパクトな方法でエラー型を定義するのに役立つ多くの便利な属性を備えています。
  • #[error] のメッセージは Display トレイトを derive するために使用されます。
  • thiserror::Error derive マクロは、(std::error::Error トレイトを実装する効果がありますが、これと同じものではありません。トレイトとマクロは名前空間を共有しません。