aboutsummaryrefslogtreecommitdiffstats
path: root/src/run/builtin.rs
diff options
context:
space:
mode:
authorJonas Maier <>2026-04-17 17:56:58 +0200
committerJonas Maier <>2026-04-17 17:56:58 +0200
commitb677713a7caf179b144674ff4c6e6b7171ad1337 (patch)
tree073c32bac54fe2b960203ddd307530a5e761ebad /src/run/builtin.rs
parentddd2627360ee7a30b26cd3b7fab19ede55c574d7 (diff)
downloadpish-b677713a7caf179b144674ff4c6e6b7171ad1337.tar.gz
aliases
Diffstat (limited to 'src/run/builtin.rs')
-rw-r--r--src/run/builtin.rs84
1 files changed, 84 insertions, 0 deletions
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<Mutex<Session>>,
+ 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 <crate::parse::ExpString as crate::parse::Parse>::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<Mutex<Session>>,
+ 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