Skip to main content

gitee_cli_rs/cmd/
alias.rs

1use std::io::Write;
2
3use super::Ctx;
4use crate::cli::AliasCmd;
5use crate::config::Config;
6use crate::error::Result;
7use serde::Serialize;
8
9#[derive(Serialize)]
10struct AliasEntry {
11    name: String,
12    expansion: String,
13}
14
15pub fn execute(ctx: &Ctx, cmd: AliasCmd) -> Result<()> {
16    match cmd {
17        AliasCmd::List => {
18            let items: Vec<AliasEntry> = Config::alias_list()?
19                .into_iter()
20                .map(|(name, expansion)| AliasEntry { name, expansion })
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 aliases)")?;
26                } else {
27                    for item in &items {
28                        writeln!(w, "alias {}='{}'", item.name, item.expansion)?;
29                    }
30                }
31                Ok(())
32            })?;
33        }
34        AliasCmd::Set { name, expansion } => {
35            let expansion = expansion.join(" ");
36            Config::alias_set(&name, &expansion)?;
37            let entry = AliasEntry {
38                name: name.clone(),
39                expansion: expansion.clone(),
40            };
41            let mut out = std::io::stdout().lock();
42            ctx.out.render(&mut out, &entry, |w| {
43                writeln!(w, "alias {name}='{expansion}'")?;
44                Ok(())
45            })?;
46        }
47        AliasCmd::Delete { name } => {
48            Config::alias_delete(&name)?;
49            let entry = AliasEntry {
50                name: name.clone(),
51                expansion: String::new(),
52            };
53            let mut out = std::io::stdout().lock();
54            ctx.out.render(&mut out, &entry, |w| {
55                writeln!(w, "Deleted alias {name}")?;
56                Ok(())
57            })?;
58        }
59    }
60    Ok(())
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66    use crate::cli::{AliasCmd, Cli};
67    use clap::Parser;
68
69    #[test]
70    fn alias_set_and_delete_use_output_render() {
71        let _env = crate::config::test_config_env_lock();
72        let dir = std::env::temp_dir().join(format!(
73            "gitee-cli-alias-json-{}",
74            std::process::id()
75        ));
76        let _ = std::fs::remove_dir_all(&dir);
77        std::fs::create_dir_all(&dir).unwrap();
78        crate::config::set_test_dir(Some(dir.clone()));
79        let cli = Cli::try_parse_from([
80            "gitee",
81            "--json=",
82            "alias",
83            "set",
84            "co",
85            "pr",
86            "checkout",
87        ])
88        .unwrap();
89        let ctx = super::super::build_inner(&cli, false).unwrap();
90        execute(
91            &ctx,
92            AliasCmd::Set {
93                name: "co".into(),
94                expansion: vec!["pr".into(), "checkout".into()],
95            },
96        )
97        .unwrap();
98        execute(&ctx, AliasCmd::Delete { name: "co".into() }).unwrap();
99        crate::config::set_test_dir(None);
100        let _ = std::fs::remove_dir_all(&dir);
101    }
102}