contract_cli/commands/
config.rs1use 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}