1use crate::client::accounting::AccountingClient;
2use crate::config::Config;
3use crate::error::YukiError;
4use crate::output::{
5 ListOptions, OutputFormat, apply_pagination, format_json, format_table, is_tty,
6};
7
8pub async fn list(
9 config: &Config,
10 format: Option<&str>,
11 opts: ListOptions<'_>,
12) -> Result<(), YukiError> {
13 let mut client = AccountingClient::new();
14 client.authenticate(&config.api_key).await?;
15 let admins = client.administrations().await?;
16
17 let headers = vec!["Name".into(), "Admin ID".into(), "Domain ID".into()];
18 let mut rows: Vec<Vec<String>> = admins
19 .iter()
20 .map(|a| vec![a.name.clone(), a.id.clone(), a.domain_id.clone()])
21 .collect();
22
23 apply_pagination(&mut rows, &opts);
24
25 let fmt = OutputFormat::from_flag(format, is_tty());
26 match fmt {
27 OutputFormat::Table => println!("{}", format_table(&headers, &rows)),
28 OutputFormat::Json => println!("{}", format_json(&headers, &rows)),
29 }
30 Ok(())
31}
32
33pub fn switch(config: &mut Config, name: &str) -> Result<(), YukiError> {
34 if !config.administrations.contains_key(name) {
35 return Err(YukiError::Config(format!(
36 "unknown administration: {name}. Run 'yuki admin list' to see available administrations."
37 )));
38 }
39 config.default_admin = name.to_string();
40 config.save_to(&Config::default_path())?;
41 eprintln!("Switched default administration to: {name}");
42 Ok(())
43}