yuki-cli 0.1.10

CLI client for the Yuki bookkeeping SOAP API
Documentation
use crate::client::accounting::AccountingClient;
use crate::config::Config;
use crate::error::YukiError;
use crate::output::{
    ListOptions, OutputFormat, apply_pagination, format_json, format_table, is_tty, select_fields,
};

pub async fn list(
    config: &Config,
    format: Option<&str>,
    opts: ListOptions<'_>,
) -> Result<(), YukiError> {
    let mut client = AccountingClient::new();
    client.authenticate(&config.api_key).await?;
    let admins = client.administrations().await?;

    let mut headers = vec!["Name".into(), "Admin ID".into(), "Domain ID".into()];
    let mut rows: Vec<Vec<String>> = admins
        .iter()
        .map(|a| vec![a.name.clone(), a.id.clone(), a.domain_id.clone()])
        .collect();

    apply_pagination(&mut rows, &opts);
    select_fields(&mut headers, &mut rows, &opts)?;

    let fmt = OutputFormat::from_flag(format, is_tty());
    match fmt {
        OutputFormat::Table => println!("{}", format_table(&headers, &rows)),
        OutputFormat::Json => println!("{}", format_json(&headers, &rows)),
    }
    Ok(())
}

pub fn switch(config: &mut Config, name: &str) -> Result<(), YukiError> {
    if !config.administrations.contains_key(name) {
        return Err(YukiError::Config(format!(
            "unknown administration: {name}. Run 'yuki admin list' to see available administrations."
        )));
    }
    config.default_admin = name.to_string();
    config.save_to(&Config::default_path())?;
    eprintln!("Switched default administration to: {name}");
    Ok(())
}