use thiserror::Error;
use reqwest::StatusCode;
use serde_json::Error as JsonError; use std::time::Duration;
#[derive(Debug, Error)]
pub enum CepError {
#[error("CEP inválido: formato deve ser 00000000 ou 00000-000")]
CepInvalido,
#[error("CEP não encontrado em nenhum provedor")]
CepNaoEncontrado,
#[error("Provedor '{0}' indisponível")]
ProvedorIndisponivel(String),
#[error("Provedor '{0}' não implementado")]
ProvedorNaoImplementado(String),
#[error("Limite de requisições excedido no provedor '{0}'")]
RateLimitExcedido(String),
#[error("Falha na requisição: {0}")]
FalhaRequisicao(String),
#[error("Timeout após {0:?} - nenhum provedor respondeu a tempo")]
Timeout(Duration),
#[error("Erro ao parsear resposta: {0}")]
ParseError(String),
#[error("Nenhum provedor disponível para consulta")]
SemProvedoresDisponiveis,
}
impl From<reqwest::Error> for CepError {
fn from(err: reqwest::Error) -> Self {
if err.is_timeout() {
CepError::Timeout(Duration::from_secs(2))
} else if err.is_decode() {
CepError::ParseError("Falha ao decodificar resposta JSON".into())
} else {
CepError::FalhaRequisicao(err.to_string())
}
}
}
impl From<JsonError> for CepError {
fn from(err: JsonError) -> Self {
CepError::ParseError(err.to_string())
}
}