Skip to main content

gitee_cli_rs/cmd/
config_cmd.rs

1use std::io::Write;
2
3use super::Ctx;
4use crate::cli::ConfigCmd;
5use crate::config::Config;
6use crate::error::{GiteeError, Result};
7use serde::Serialize;
8
9#[derive(Serialize)]
10struct ConfigEntry {
11    key: String,
12    value: String,
13}
14
15pub fn execute(ctx: &Ctx, cmd: ConfigCmd) -> Result<()> {
16    match cmd {
17        ConfigCmd::List => {
18            let items: Vec<ConfigEntry> = Config::list_keys()?
19                .into_iter()
20                .map(|(key, value)| ConfigEntry { key, value })
21                .collect();
22            let mut out = std::io::stdout().lock();
23            ctx.out.render(&mut out, &items, |w| {
24                if items.is_empty() {
25                    writeln!(w, "(no config keys set)")?;
26                } else {
27                    for item in &items {
28                        writeln!(w, "{}={}", item.key, item.value)?;
29                    }
30                }
31                Ok(())
32            })?;
33        }
34        ConfigCmd::Get { key } => {
35            match Config::get_key(&key)? {
36                Some(value) => {
37                    let entry = ConfigEntry {
38                        key: key.clone(),
39                        value: value.clone(),
40                    };
41                    let mut out = std::io::stdout().lock();
42                    ctx.out.render(&mut out, &entry, |w| {
43                        writeln!(w, "{value}")?;
44                        Ok(())
45                    })?;
46                }
47                None => {
48                    return Err(GiteeError::Usage(format!(
49                        "config key '{key}' is not set"
50                    )))
51                }
52            }
53        }
54        ConfigCmd::Set { key, value } => {
55            Config::set_key(&key, &value)?;
56            let entry = ConfigEntry {
57                key: key.clone(),
58                value: value.clone(),
59            };
60            let mut out = std::io::stdout().lock();
61            ctx.out.render(&mut out, &entry, |w| {
62                writeln!(w, "set {key}={value}")?;
63                Ok(())
64            })?;
65        }
66    }
67    Ok(())
68}
69
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74    use crate::cli::ConfigCmd;
75    use clap::Parser;
76    #[test]
77    fn config_set_uses_output_render() {
78        let _env = crate::config::test_config_env_lock();
79        let dir = std::env::temp_dir().join(format!(
80            "gitee-cli-config-set-json-{}",
81            std::process::id()
82        ));
83        let _ = std::fs::remove_dir_all(&dir);
84        std::fs::create_dir_all(&dir).unwrap();
85        crate::config::set_test_dir(Some(dir.clone()));
86        let cli = crate::cli::Cli::try_parse_from(["gitee", "--json=", "config", "set", "editor", "vim"]).unwrap();
87        let ctx = super::super::build_inner(&cli, false).unwrap();
88        execute(&ctx, ConfigCmd::Set {
89            key: "editor".into(),
90            value: "vim".into(),
91        })
92        .unwrap();
93        crate::config::set_test_dir(None);
94        let _ = std::fs::remove_dir_all(&dir);
95    }
96}