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