Skip to main content

nfe_core/
error.rs

1//! Módulo de erros do nfe-core
2
3use 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}