thiserror

Крейт thiserror містить макроси, які допомагають уникнути повторювань при визначенні типів помилок. Він містить похідні макроси, які допомагають реалізувати From<T>, Display та трейтError.

use std::fs;
use std::io::Read;
use thiserror::Error;

#[derive(Error)]
enum ReadUsernameError {
    #[error("I/O помилка: {e}")]
    IoError(#[from] io::Error),
    #[error("Не знайдено імені користувача в {0}")]
    EmptyUsername(String),
}

fn read_username(path: &str) -> Result<String, ReadUsernameError> {
    let mut username = String::with_capacity(100);
    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}"),
        Err(err) => println!("Помилка: {err:?}"),
    }
}
This slide should take about 5 minutes.
  • Похідний макрос Error надається thiserror і має багато корисних атрибутів для компактного визначення типів помилок.
  • Повідомлення з #[error] використовується для отримання трейту Display.
  • Зауважте, що похідний макрос (thiserror::)Error, хоча і має ефект реалізації трейту (std::error::)Error, не є тим самим; трейти та макроси не мають спільного простору імен.