diff options
author | Rory Dudley | 2024-05-20 23:54:01 -0600 |
---|---|---|
committer | Rory Dudley | 2024-05-20 23:54:01 -0600 |
commit | dedadcfd30516c40692fe495a6ad10aea7c050de (patch) | |
tree | ce0f8dcb6546bbd9e0f61a35c88c32c9c6c608ab /src/poem | |
parent | 85a3bd273e927b8dc31aadf263b93ef8fd3b7a39 (diff) | |
download | dwarvish-dedadcfd30516c40692fe495a6ad10aea7c050de.tar.gz |
Added the 'which' built-in command
Added a built-in which command (for MacOS and BSD), which can check
aliases, and other shell built-in commands, in addition to bins on the
$PATH.
Diffstat (limited to 'src/poem')
-rw-r--r-- | src/poem/anthology.rs | 6 | ||||
-rw-r--r-- | src/poem/anthology/which.rs | 61 |
2 files changed, 65 insertions, 2 deletions
diff --git a/src/poem/anthology.rs b/src/poem/anthology.rs index 7766f62..8ff70f9 100644 --- a/src/poem/anthology.rs +++ b/src/poem/anthology.rs @@ -3,12 +3,13 @@ mod cd; mod exit; mod export; mod source; +mod which; use crate::compose::Environment; use crate::poem::Verse; /// A static list of all the built-in commands -static INDEX: [&str; 7] = [ - "alias", "cd", "exit", "export", "source", "unalias", "unset", +static INDEX: [&str; 8] = [ + "alias", "cd", "exit", "export", "source", "unalias", "unset", "which", ]; /// Lookup the index of a built-in command @@ -53,6 +54,7 @@ pub fn incant(verse: &Verse, out: &mut Vec<u8>, index: usize, env: &mut Environm "source" => source::incant(verse, out, env), "unalias" => alias::unincant(verse, &mut env.aliases), "unset" => export::unincant(verse), + "which" => which::incant(verse, out, env), _ => unreachable!(), } } diff --git a/src/poem/anthology/which.rs b/src/poem/anthology/which.rs new file mode 100644 index 0000000..515b52e --- /dev/null +++ b/src/poem/anthology/which.rs @@ -0,0 +1,61 @@ +use crate::compose::Environment; +use crate::poem::Verse; + +pub fn incant(verse: &Verse, out: &mut Vec<u8>, env: &Environment) -> i32 { + let mut status = 0; + match verse.clause() { + Some(clause) => { + let mut output: String; + for word in clause { + // Check if it's an alias + if env.aliases.contains_key(&word) { + output = format!("{}: aliased to {}\n", word, env.aliases.get(&word).unwrap()); + if verse.couplet > 0 { + out.append(&mut output.as_bytes().to_vec()); + } else { + print!("{}", output); + } + continue; + } + + // Check if it's a built-in + match super::lookup(&word) { + Some(_) => { + output = format!("{}: shell built-in command\n", word); + if verse.couplet > 0 { + out.append(&mut output.as_bytes().to_vec()); + } else { + print!("{}", output); + } + continue; + } + None => {} + } + + // Manually check the path + let mut verb = Verse::new(); + verb.push(word.clone()); + match verb.spellcheck(&env.bins) { + Some(i) => { + output = format!("{}\n", env.bins[i]); + if verse.couplet > 0 { + out.append(&mut output.as_bytes().to_vec()); + } else { + print!("{}", output); + } + } + None => { + output = format!("{} not found\n", word); + status = 1; + eprint!("{}", output); + } + } + } + } + None => { + eprintln!("which: not enough arguments"); + return 1; + } + } + status +} |