1use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum Error {
7 #[error("Erro de configuração: {0}")]
8 Config(String),
9
10 #[error("Erro no certificado: {0}")]
11 Certificado(String),
12
13 #[error("Erro de comunicação: {0}")]
14 Comunicacao(String),
15
16 #[error("Erro ao processar XML: {0}")]
17 Xml(String),
18
19 #[error("Erro de validação: {0}")]
20 Validacao(String),
21
22 #[error("Erro na assinatura digital: {0}")]
23 Assinatura(String),
24
25 #[error("Rejeição da SEFAZ (código {codigo}): {mensagem}")]
26 Rejeicao { codigo: u32, mensagem: String },
27
28 #[error("Chave de acesso inválida: {0}")]
29 ChaveAcessoInvalida(String),
30
31 #[error("CNPJ inválido")]
32 InvalidCnpj,
33
34 #[error("Documento não encontrado: {0}")]
35 DocumentoNaoEncontrado(String),
36
37 #[error("Erro de IO: {0}")]
38 Io(#[from] std::io::Error),
39
40 #[error("Erro interno: {0}")]
41 Interno(String),
42}
43
44pub type Result<T> = std::result::Result<T, Error>;
45
46#[cfg(test)]
47mod tests {
48 use super::*;
49
50 #[test]
51 fn test_error_display() {
52 let err = Error::Config("Configuração inválida".to_string());
53 assert_eq!(
54 format!("{}", err),
55 "Erro de configuração: Configuração inválida"
56 );
57 }
58
59 #[test]
60 fn test_error_from_io() {
61 let io_error = std::io::Error::new(std::io::ErrorKind::NotFound, "arquivo não encontrado");
62 let error: Error = io_error.into();
63 assert!(matches!(error, Error::Io(_)));
64 }
65}