gitee_cli_rs/cmd/
config_cmd.rs1use 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}