konduto/errors/
error.rs

1use thiserror::Error;
2
3/// Tipo de resultado padrão para operações da SDK
4pub type KondutoResult<T> = Result<T, KondutoError>;
5
6/// Erros possíveis ao interagir com a API da Konduto
7#[derive(Error, Debug)]
8pub enum KondutoError {
9    /// Erro ao realizar requisição HTTP
10    #[error("Erro de requisição HTTP: {0}")]
11    HttpError(#[from] reqwest::Error),
12
13    /// Erro de serialização/deserialização JSON
14    #[error("Erro de serialização JSON: {0}")]
15    SerializationError(#[from] serde_json::Error),
16
17    /// Erro retornado pela API da Konduto
18    #[error("Erro da API Konduto: {status} - {message}")]
19    ApiError {
20        status: u16,
21        message: String,
22        code: Option<String>,
23    },
24
25    /// Erro de autenticação
26    #[error("Erro de autenticação: {0}")]
27    AuthenticationError(String),
28
29    /// Erro de validação de dados
30    #[error("Erro de validação: {0}")]
31    ValidationError(String),
32
33    /// Variável de ambiente ausente
34    #[error("Variável de ambiente ausente: {0}")]
35    MissingEnvVar(String),
36
37    /// Erro genérico
38    #[error("Erro: {0}")]
39    GenericError(String),
40}
41
42impl KondutoError {
43    /// Cria um erro de API a partir de um status HTTP e mensagem
44    /// todo aqui acho que é melhor parsear para os dois tipos de erro da konduto ref <https://docs.konduto.com/reference/respostas-de-erro-1>
45    pub fn api_error(status: u16, message: String, code: Option<String>) -> Self {
46        KondutoError::ApiError {
47            status,
48            message,
49            code,
50        }
51    }
52}
53
54impl From<reqwest_middleware::Error> for KondutoError {
55    fn from(err: reqwest_middleware::Error) -> Self {
56        // O reqwest_middleware::Error pode conter um reqwest::Error ou um erro de middleware
57        match err {
58            reqwest_middleware::Error::Middleware(e) => {
59                KondutoError::GenericError(format!("Middleware error: {}", e))
60            }
61            reqwest_middleware::Error::Reqwest(e) => KondutoError::HttpError(e),
62        }
63    }
64}