diff options
author | Rory Dudley | 2024-03-30 20:15:12 -0600 |
---|---|---|
committer | Rory Dudley | 2024-03-30 20:15:12 -0600 |
commit | 2439f63a1c0859fd454d4a67dc36b61ad6ab5eb8 (patch) | |
tree | 51926cec235e93eb759eacb5761e398dc50fc7f2 /src/poem/anthology | |
parent | bc64d1917829623cea447871c548950460559232 (diff) | |
download | dwarvish-2439f63a1c0859fd454d4a67dc36b61ad6ab5eb8.tar.gz |
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<String, String>,
instead of a Vec<String>.
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.
Diffstat (limited to 'src/poem/anthology')
-rw-r--r-- | src/poem/anthology/alias.rs | 47 |
1 files changed, 47 insertions, 0 deletions
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<String, String>) -> 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<String, String>) -> i32 { + match verse.clause() { + Some(clause) => { + for stanza in clause { + aliases.remove(&stanza); + } + } + None => { + eprintln!("unalias: not enough arguments"); + return 1; + } + } + 0 +} |