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
//! Catálogo de endpoints conhecidos da plataforma APIBrasil.
//!
//! Os dados em [`catalog`] são gerados do catálogo real do gateway
//! (`GET /api/v2/documentations`):
//!
//! ```bash
//! cargo run --features blocking --bin codegen
//! ```
//!
//! ```
//! use apibrasil::generated;
//!
//! assert!(generated::has_action("whatsapp", "sendText"));
//! assert!(generated::service_actions_for("cep").contains(&"cidades"));
//!
//! if let Some(meta) = generated::consulta_tipo("acerta-essencial") {
//!     println!("{} {:?}", meta.service, meta.fields);
//! }
//! ```

pub mod catalog;

pub use catalog::{
    CONSULTA_SERVICOS, CONSULTA_TIPOS, EVOLUTION_PATHS, SERVICE_ACTIONS, SOURCE, WHATSAPP_ACTIONS,
    WHATSMEOW_ACTIONS,
};

/// Metadados de um tipo de consulta: o serviço da rota e os campos do
/// body de exemplo.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ConsultaTipoMeta {
    /// Serviço da rota (`/consulta/{service}/credits`).
    pub service: &'static str,
    /// Campos do body de exemplo, fora `tipo` e `homolog`.
    pub fields: &'static [&'static str],
}

/// Devolve os metadados de um tipo de consulta (campo `tipo` do body).
pub fn consulta_tipo(tipo: &str) -> Option<&'static ConsultaTipoMeta> {
    let index = CONSULTA_TIPOS
        .binary_search_by(|(candidate, _)| (*candidate).cmp(tipo))
        .ok()?;
    Some(&CONSULTA_TIPOS[index].1)
}

/// Devolve as actions documentadas de um serviço do gateway.
pub fn service_actions_for(service: &str) -> &'static [&'static str] {
    match SERVICE_ACTIONS.binary_search_by(|(candidate, _)| (*candidate).cmp(service)) {
        Ok(index) => SERVICE_ACTIONS[index].1,
        Err(_) => &[],
    }
}

/// Informa se uma action é documentada para o serviço.
pub fn has_action(service: &str, action: &str) -> bool {
    service_actions_for(service).contains(&action)
}

/// Lista os serviços do gateway presentes no catálogo.
pub fn services() -> impl Iterator<Item = &'static str> {
    SERVICE_ACTIONS.iter().map(|(service, _)| *service)
}