Derivando Enums de Erro

O crate thiserror Ă© uma maneira popular de criar um tipo enumerado (enum) de erro, como fizemos na pĂĄgina anterior:

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

#[derive(Debug, Error)]
enum LerNomeUsuarioErro {
    #[error("NĂŁo Ă© possivel ler: {0}")]
    ErroES(#[from] io::Error),
    #[error("Nome de usuĂĄrio nĂŁo encontrado em {0}")]
    NomeUsuarioVazio(String),
}

fn ler_nome_usuario(caminho: &str) -> Result<String, LerNomeUsuarioErro> {
    let mut nome_usuario = String::new();
    fs::File::open(caminho)?.read_to_string(&mut nome_usuario)?;
    if nome_usuario.is_empty() {
        return Err(LerNomeUsuarioErro::NomeUsuarioVazio(String::from(caminho)));
    }
    Ok(nome_usuario)
}

fn main() {
    //fs::write("config.dat", "").unwrap();
    match ler_nome_usuario("config.dat") {
        Ok(nome_usuario) => println!("Nome do usuĂĄrio: {nome_usuario}"),
        Err(err)     => println!("Erro: {err}"),
    }
}

A derive macro thiserror implementa automaticamente std::error::Error, e opcionalmente, Display (se os atributos #[error(...)] forem fornecidos) e From (se o atributo #[from] for adicionado). Também funciona para structs.

NĂŁo afeta sua API pĂșblica, o que a torna boa para bibliotecas.