summaryrefslogtreecommitdiffstats
path: root/src/poem/anthology/alias.rs
diff options
context:
space:
mode:
authorRory Dudley2024-03-30 20:15:12 -0600
committerRory Dudley2024-03-30 20:15:12 -0600
commit2439f63a1c0859fd454d4a67dc36b61ad6ab5eb8 (patch)
tree51926cec235e93eb759eacb5761e398dc50fc7f2 /src/poem/anthology/alias.rs
parentbc64d1917829623cea447871c548950460559232 (diff)
downloaddwarvish-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/alias.rs')
-rw-r--r--src/poem/anthology/alias.rs47
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
+}