apibrasil 1.0.0

SDK oficial Rust da plataforma APIBrasil: WhatsApp, SMS, consultas de CPF/CNPJ, veiculos, CEP, correios, pagamentos PIX/boleto e mais.
Documentation
use std::sync::Arc;

use crate::core::{CreditResponse, HttpClient, IntoBody, RequestOptions, Result};
use crate::services::CreditService;

/// Consultas por crédito (`POST /consulta/{servico}/credits` e afins).
///
/// Não usam `DeviceToken` — debitam o saldo/créditos da conta. O campo
/// `tipo` do body define o produto consultado (ex: `lista-socios`,
/// `serasa-score-pf`, `spc-serasa`); os tipos conhecidos estão em
/// [`CONSULTA_TIPOS`](crate::generated::CONSULTA_TIPOS). Use
/// [`Consulta`](crate::Consulta) para montar o body, inclusive em modo
/// homologação.
///
/// ```no_run
/// # use apibrasil::{ApiBrasil, Consulta};
/// # use serde_json::json;
/// # async fn exemplo(api: ApiBrasil) -> apibrasil::Result<()> {
/// let cpf = api.consulta().cpf(json!({ "cpf": "00000000000" })).await?;
/// println!("{:?} {:?}", cpf.balance(), cpf.data());
///
/// api.consulta()
///     .cnpj(Consulta::new("lista-socios").field("cnpj", "00000000000000"))
///     .await?;
///
/// // qualquer serviço do catálogo
/// api.consulta().generic("cnh", json!({ "cpf": "00000000000" })).await?;
/// # Ok(())
/// # }
/// ```
#[derive(Clone, Debug)]
pub struct ConsultaService {
    base: CreditService,
}

impl ConsultaService {
    pub(crate) fn new(client: Arc<HttpClient>) -> Self {
        Self {
            base: CreditService::new(client),
        }
    }

    /// Devolve uma cópia do serviço que usa `options` em todas as
    /// chamadas.
    pub fn with_options(&self, options: RequestOptions) -> Self {
        Self {
            base: self.base.with_options(options),
        }
    }

    /// Executa uma consulta genérica:
    /// `POST /consulta/{servico}/credits`.
    pub async fn generic(&self, service: &str, body: impl IntoBody) -> Result<CreditResponse> {
        self.base.request(service, body).await
    }

    /// Consulta o birô Quod: `POST /quod/cnpj/credits`.
    pub async fn quod(&self, body: impl IntoBody) -> Result<CreditResponse> {
        self.base.credit_post("quod/cnpj/credits", body).await
    }

    /// Consulta as bases veiculares dedicadas:
    /// `POST /vehicles/base/000/{base}` (base: `dados` | `fipe`).
    pub async fn veiculos_base(&self, base: &str, body: impl IntoBody) -> Result<CreditResponse> {
        self.base
            .credit_post(&format!("vehicles/base/000/{base}"), body)
            .await
    }

    /// Calcula a distância entre CEPs: `POST /cep/distancia/calcular`.
    pub async fn cep_distancia(&self, body: impl IntoBody) -> Result<CreditResponse> {
        self.base.credit_post("cep/distancia/calcular", body).await
    }

    /// Consulta o proxy seller: `POST /proxy/seller/credits`.
    pub async fn proxy_seller(&self, body: impl IntoBody) -> Result<CreditResponse> {
        self.base.credit_post("proxy/seller/credits", body).await
    }
}

impl std::ops::Deref for ConsultaService {
    type Target = CreditService;

    fn deref(&self) -> &CreditService {
        &self.base
    }
}

credit_methods! {
    ConsultaService {
        /// Consulta um CPF: `POST /consulta/cpf/credits`.
        cpf => "cpf",
        /// Consulta um CNPJ: `POST /consulta/cnpj/credits`
        /// (ex: `{"cnpj": "...", "tipo": "lista-socios"}`).
        cnpj => "cnpj",
        /// Consulta uma CNH: `POST /consulta/cnh/credits`.
        cnh => "cnh",
        /// Consulta um CEP: `POST /consulta/cep/credits`.
        cep => "cep",
        /// Consulta veicular: `POST /consulta/veiculos/credits`.
        veiculos => "veiculos",
        /// Consulta veicular na rota em inglês:
        /// `POST /consulta/vehicles/credits`.
        vehicles => "vehicles",
        /// Consulta a operadora de um telefone:
        /// `POST /consulta/telefone/credits`.
        telefone => "telefone",
        /// Consulta o DDD na Anatel: `POST /consulta/ddd-anatel/credits`.
        ddd_anatel => "ddd-anatel",
        /// Consulta a base de IPs: `POST /consulta/geoip/credits`.
        geoip => "geoip",
        /// Rastreia uma encomenda: `POST /consulta/rastreio/credits`.
        rastreio => "rastreio",
        /// Consulta um registro no CRM: `POST /consulta/crm/credits`.
        crm => "crm",
        /// Consulta um registro no CRBM: `POST /consulta/crbm/credits`.
        crbm => "crbm",
        /// Consulta um registro no CRO: `POST /consulta/cro/credits`.
        cro => "cro",
        /// Consulta a previsão do tempo:
        /// `POST /consulta/weather-api/credits`.
        weather => "weather-api",
        /// Emite notas fiscais: `POST /consulta/emissao-notas/credits`.
        emissao_notas => "emissao-notas",
        /// Calcula o frete ANTT: `POST /consulta/frete-antt/credits`.
        frete_antt => "frete-antt",
        /// Consulta o RNTRC: `POST /consulta/api-rntrc/credits`.
        api_rntrc => "api-rntrc",
    }
}