From 2439f63a1c0859fd454d4a67dc36b61ad6ab5eb8 Mon Sep 17 00:00:00 2001 From: Rory Dudley Date: Sat, 30 Mar 2024 20:15:12 -0600 Subject: Add the 'alias' built-in command The shell now has support for aliases (via alias foo=bar). The 'unalias' command is also available to remove aliases. Finally, Environment::aliases was changed to be a HashMap, instead of a Vec. Since the verse's verb might change (for instance, it is an environment variable, or an alias), add another check in Poem::recite, which simply continues, instead of running the spellchecker, if the verb is empty. --- src/poem/anthology/alias.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/poem/anthology/alias.rs (limited to 'src/poem/anthology/alias.rs') diff --git a/src/poem/anthology/alias.rs b/src/poem/anthology/alias.rs new file mode 100644 index 0000000..6a8e739 --- /dev/null +++ b/src/poem/anthology/alias.rs @@ -0,0 +1,47 @@ +use crate::poem::Verse; +use std::collections::HashMap; + +pub fn incant(verse: &Verse, aliases: &mut HashMap) -> i32 { + match verse.clause() { + Some(clause) => { + for stanza in clause { + let (key, val) = match stanza.split_once("=") { + Some((key, val)) => (key, val), + None => continue, + }; + aliases.insert(String::from(key), String::from(val)); + } + } + None => { + for (key, val) in aliases { + if key.contains(' ') && val.contains(' ') { + println!("'{}'='{}'", key, val); + } else if key.contains(' ') { + println!("'{}'={}", key, val); + } else if val.contains(' ') { + println!("{}='{}'", key, val); + } else if val.is_empty() { + println!("{}=''", key); + } else { + println!("{}={}", key, val); + } + } + } + } + 0 +} + +pub fn unincant(verse: &Verse, aliases: &mut HashMap) -> i32 { + match verse.clause() { + Some(clause) => { + for stanza in clause { + aliases.remove(&stanza); + } + } + None => { + eprintln!("unalias: not enough arguments"); + return 1; + } + } + 0 +} -- cgit v1.2.3