pagbank-cli 0.2.0

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

use crate::cli::ConnectAction;
use crate::output;

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

    match action {
        ConnectAction::AppCreate {
            name,
            description,
            site,
            redirect_uri,
            logo,
        } => {
            let mut body = serde_json::json!({ "name": name });
            if let Some(d) = description {
                body["description"] = serde_json::json!(d);
            }
            if let Some(s) = site {
                body["site"] = serde_json::json!(s);
            }
            if let Some(r) = redirect_uri {
                body["redirect_uri"] = serde_json::json!(r);
            }
            if let Some(l) = logo {
                body["logo"] = serde_json::json!(l);
            }
            let result = pagbank_sdk::endpoints::connect::create_app(&client, &body).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("Aplicação Connect Criada", &val)
                }
            }
            Ok(())
        }
        ConnectAction::AppGet { id } => {
            let result = pagbank_sdk::endpoints::connect::get_app(&client, &id).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("Aplicação Connect", &val)
                }
            }
            Ok(())
        }
        ConnectAction::Authorize {
            app_id,
            redirect_uri,
            scope,
        } => {
            let url = pagbank_sdk::endpoints::connect::get_authorize_url(
                &client,
                &app_id,
                &redirect_uri,
                &scope,
            )
            .await;
            output::print_info(&format!("URL de autorização:\n{url}"));
            Ok(())
        }
        ConnectAction::Token { code } => {
            let client_id = client.config.client_id.as_deref().unwrap_or("");
            let client_secret = client.config.client_secret.as_deref().unwrap_or("");
            let body = serde_json::json!({
                "grant_type": "authorization_code",
                "code": code,
                "client_id": client_id,
                "client_secret": client_secret,
            });
            let result = pagbank_sdk::endpoints::connect::create_token(&client, &body).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("Access Token", &val),
            }
            Ok(())
        }
        ConnectAction::TokenRefresh { refresh_token } => {
            let client_id = client.config.client_id.as_deref().unwrap_or("");
            let client_secret = client.config.client_secret.as_deref().unwrap_or("");
            let body = serde_json::json!({
                "grant_type": "refresh_token",
                "refresh_token": refresh_token,
                "client_id": client_id,
                "client_secret": client_secret,
            });
            let result = pagbank_sdk::endpoints::connect::refresh_token(&client, &body).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("Token Renovado", &val)
                }
            }
            Ok(())
        }
        ConnectAction::TokenRevoke { token } => {
            let body = serde_json::json!({ "token": token });
            pagbank_sdk::endpoints::connect::revoke_token(&client, &body).await?;
            output::print_success("Token revogado com sucesso");
            Ok(())
        }
        ConnectAction::AuthorizeSms {
            bank_branch,
            account_number,
        } => {
            let body = serde_json::json!({
                "bank_branch": bank_branch,
                "account_number": account_number,
            });
            let result = pagbank_sdk::endpoints::connect::create_sms_auth(&client, &body).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("Autorização SMS", &val)
                }
            }
            Ok(())
        }
    }
}