use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error("Erro de configuração: {0}")]
Config(String),
#[error("Erro no certificado: {0}")]
Certificado(String),
#[error("Erro de comunicação: {0}")]
Comunicacao(String),
#[error("Erro ao processar XML: {0}")]
Xml(String),
#[error("Erro de validação: {0}")]
Validacao(String),
#[error("Erro na assinatura digital: {0}")]
Assinatura(String),
#[error("Rejeição da SEFAZ (código {codigo}): {mensagem}")]
Rejeicao { codigo: u32, mensagem: String },
#[error("Chave de acesso inválida: {0}")]
ChaveAcessoInvalida(String),
#[error("CNPJ inválido")]
InvalidCnpj,
#[error("Documento não encontrado: {0}")]
DocumentoNaoEncontrado(String),
#[error("Erro de IO: {0}")]
Io(#[from] std::io::Error),
#[error("Erro interno: {0}")]
Interno(String),
}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = Error::Config("Configuração inválida".to_string());
assert_eq!(
format!("{}", err),
"Erro de configuração: Configuração inválida"
);
}
#[test]
fn test_error_from_io() {
let io_error = std::io::Error::new(std::io::ErrorKind::NotFound, "arquivo não encontrado");
let error: Error = io_error.into();
assert!(matches!(error, Error::Io(_)));
}
}