pagbank-cli 0.2.0

CLI para as APIs do PagBank
use anyhow::Result;

use crate::cli::ClubPagAction;
use crate::output;

pub async fn run(
    action: ClubPagAction,
    env_override: Option<&str>,
    output_fmt: &crate::cli::OutputFormat,
) -> Result<()> {
    let client = crate::client::load_client(env_override)?;

    match action {
        ClubPagAction::Settings => {
            let result = pagbank_sdk::endpoints::clubpag::get_settings(&client).await?;
            let val = serde_json::to_value(result)?;
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&val),
                crate::cli::OutputFormat::Table => {
                    output::print_object_table("Configurações ClubPag", &val)
                }
            }
            Ok(())
        }
        ClubPagAction::UpdateSettings { enabled } => {
            let body = serde_json::json!({ "enabled": enabled });
            let result = pagbank_sdk::endpoints::clubpag::update_settings(&client, &body).await?;
            let val = serde_json::to_value(result)?;
            output::print_success("Configurações atualizadas");
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&val),
                crate::cli::OutputFormat::Table => {
                    output::print_object_table("Configurações", &val)
                }
            }
            Ok(())
        }
        ClubPagAction::Purchase { order_id, amount } => {
            let body = serde_json::json!({
                "order_id": order_id,
                "amount": { "value": amount, "currency": "BRL" },
            });
            let result = pagbank_sdk::endpoints::clubpag::identify_purchase(&client, &body).await?;
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&result),
                crate::cli::OutputFormat::Table => {
                    output::print_object_table("Compra Identificada", &result)
                }
            }
            Ok(())
        }
        ClubPagAction::Benefits => {
            let result = pagbank_sdk::endpoints::clubpag::list_benefits(&client).await?;
            let val = serde_json::to_value(result)?;
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&val),
                crate::cli::OutputFormat::Table => {
                    if let Some(arr) = val.as_array() {
                        let rows: Vec<Vec<String>> = arr
                            .iter()
                            .map(|b| {
                                vec![
                                    b["id"].as_str().unwrap_or("").to_string(),
                                    b["name"].as_str().unwrap_or("").to_string(),
                                    b["status"].as_str().unwrap_or("").to_string(),
                                ]
                            })
                            .collect();
                        output::print_table(&["ID", "Nome", "Status"], rows);
                    }
                }
            }
            Ok(())
        }
        ClubPagAction::Redeem { benefit_id, amount } => {
            let mut body = serde_json::json!({ "benefit_id": benefit_id });
            if let Some(a) = amount {
                body["amount"] = serde_json::json!({ "value": a, "currency": "BRL" });
            }
            let result = pagbank_sdk::endpoints::clubpag::redeem_benefit(&client, &body).await?;
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&result),
                crate::cli::OutputFormat::Table => {
                    output::print_object_table("Benefício Resgatado", &result)
                }
            }
            Ok(())
        }
        ClubPagAction::Cashback => {
            let result = pagbank_sdk::endpoints::clubpag::get_cashback(&client).await?;
            let val = serde_json::to_value(result)?;
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&val),
                crate::cli::OutputFormat::Table => output::print_object_table("Cashback", &val),
            }
            Ok(())
        }
        ClubPagAction::Coupons => {
            let result = pagbank_sdk::endpoints::clubpag::list_coupons(&client).await?;
            let val = serde_json::to_value(result)?;
            match output_fmt {
                crate::cli::OutputFormat::Json => output::print_json(&val),
                crate::cli::OutputFormat::Table => {
                    if let Some(arr) = val.as_array() {
                        let rows: Vec<Vec<String>> = arr
                            .iter()
                            .map(|c| {
                                vec![
                                    c["id"].as_str().unwrap_or("").to_string(),
                                    c["name"].as_str().unwrap_or("").to_string(),
                                    c["description"].as_str().unwrap_or("").to_string(),
                                ]
                            })
                            .collect();
                        output::print_table(&["ID", "Nome", "Descrição"], rows);
                    }
                }
            }
            Ok(())
        }
    }
}