From b677713a7caf179b144674ff4c6e6b7171ad1337 Mon Sep 17 00:00:00 2001 From: Jonas Maier <> Date: Fri, 17 Apr 2026 17:56:58 +0200 Subject: aliases --- src/run/builtin.rs | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'src/run/builtin.rs') diff --git a/src/run/builtin.rs b/src/run/builtin.rs index f0cb999..47a10c2 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -447,3 +447,87 @@ impl Builtin for var { } } } + +pub struct alias; +impl Builtin for alias { + fn name(&self) -> &str { + "alias" + } + + fn io( + &self, + session: Arc>, + mut args: &[BString], + _stdin: &mut dyn Read, + stdout: &mut dyn Write, + ) -> Result { + let Some(alias_name) = args.first() else { + writeln!(stdout, "alias: expected alias name")?; + return Err(Error::Exit(-1)); + }; + + args = &args[1..]; + if let Some(b"=") = args.first().map(|x| x.as_slice()) { + args = &args[1..]; + } + + if args.is_empty() { + writeln!(stdout, "alias: expected alias definition")?; + return Err(Error::Exit(-1)); + }; + + let mut parse_fail = false; + let mut alias_args = Vec::new(); + for arg in args { + match ::parse_from_bytes(&arg[..]) { + Ok(parsed) => { + alias_args.push(parsed); + } + Err(err) => { + writeln!( + stdout, + "alias: unparseable argument ({err:?}): {}", + arg.escape_ascii(), + )?; + parse_fail = true; + } + } + } + + if parse_fail { + return Err(Error::Exit(-1)); + } + + session + .lock() + .unwrap() + .aliases + .insert(alias_name.clone(), alias_args); + + Ok(()) + } +} + +pub struct unalias; +impl Builtin for unalias { + fn name(&self) -> &str { + "unalias" + } + + fn io( + &self, + session: Arc>, + args: &[BString], + _stdin: &mut dyn Read, + stdout: &mut dyn Write, + ) -> Result { + if args.len() != 1 { + writeln!(stdout, "unalias: expecting exactly one argument")?; + return Err(Error::Exit(-1)); + } + + session.lock().unwrap().aliases.remove(&args[0]); + + Ok(()) + } +} \ No newline at end of file -- cgit v1.2.3