Skip to main content

contract_cli/commands/
config.rs

1use crate::cli::ConfigCmd;
2use crate::config;
3use crate::error::{AppError, Result};
4use crate::output::{print_success, Ctx};
5
6fn parse_bool(key: &str, value: &str) -> Result<bool> {
7    match value.to_lowercase().as_str() {
8        "true" | "1" | "yes" | "on" => Ok(true),
9        "false" | "0" | "no" | "off" => Ok(false),
10        _ => Err(AppError::InvalidInput(format!(
11            "invalid value '{value}' for {key} — expected true or false"
12        ))),
13    }
14}
15
16pub fn run(cmd: ConfigCmd, ctx: Ctx) -> Result<()> {
17    match cmd {
18        ConfigCmd::Show => {
19            let cfg = config::load()?;
20            print_success(ctx, &cfg, |c| {
21                match toml::to_string_pretty(c) {
22                    Ok(t) => print!("{t}"),
23                    Err(_) => println!("{c:?}"),
24                }
25            });
26            Ok(())
27        }
28        ConfigCmd::Path => {
29            let p = config::config_path()?.display().to_string();
30            print_success(ctx, &p, |p| println!("{p}"));
31            Ok(())
32        }
33        ConfigCmd::Set { key, value } => {
34            let paths = finance_core::paths::Paths::resolve()?;
35            let mut cfg = config::load()?;
36            match key.as_str() {
37                "default_issuer" => {
38                    cfg.default_issuer = if value == "unset" { None } else { Some(value.clone()) };
39                }
40                "default_template" => {
41                    cfg.default_template = value.clone();
42                }
43                "open_pdf" => {
44                    cfg.open_pdf = parse_bool(&key, &value)?;
45                }
46                "self_update" => {
47                    cfg.self_update = parse_bool(&key, &value)?;
48                }
49                _ => {
50                    return Err(AppError::InvalidInput(format!(
51                        "unknown config key '{key}' (try: default_issuer, default_template, open_pdf, self_update)"
52                    )));
53                }
54            }
55            cfg.save(&paths)?;
56            print_success(ctx, &cfg, |_| println!("config saved"));
57            Ok(())
58        }
59    }
60}