rbytes_consulta_cep 0.1.0

Consulta de CEP brasileiro com multi-provedores (ViaCEP, BrasilAPI, etc). Inclui fallback automático, timeout configurável e formatação de endereços.
Documentation
// src/error.rs
use thiserror::Error;
use reqwest::StatusCode;
use serde_json::Error as JsonError;  // Agora deve resolver corretamente
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,
}

// Implementações From para conversão automática
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())
    }
}