summaryrefslogtreecommitdiffstats
path: root/src/poem/recite.rs
diff options
context:
space:
mode:
authorRory Dudley2024-03-28 21:05:00 -0600
committerRory Dudley2024-03-28 21:05:00 -0600
commit14a74aea0f02da53e0f61c572da2c5244ed80551 (patch)
treec43c5aaf46001e3743f7749cc4ebfa0baa06ad96 /src/poem/recite.rs
parent527cc04ffb9ea627ca678fe8fb07fe9330420eab (diff)
downloaddwarvish-14a74aea0f02da53e0f61c572da2c5244ed80551.tar.gz
The anthology module
The anthology module was added to run built-in commands. The 'cd' and 'exit' built-ins were moved from the main recite() loop to this module. Additionally, the 'export' and 'source' built-ins were added.
Diffstat (limited to 'src/poem/recite.rs')
-rw-r--r--src/poem/recite.rs120
1 files changed, 63 insertions, 57 deletions
diff --git a/src/poem/recite.rs b/src/poem/recite.rs
index f28436e..a88007d 100644
--- a/src/poem/recite.rs
+++ b/src/poem/recite.rs
@@ -1,9 +1,9 @@
mod ps;
use super::Poem;
use crate::path;
+use crate::poem::anthology;
use crate::poem::elements::rune::Rune;
use std::env;
-use std::process::exit;
use std::{
io,
path::Path,
@@ -129,67 +129,73 @@ impl Reciteable for Poem {
None => {}
}
- // Check if the user wants to exit the shell
- if verse.verb() == "exit" || verse.verb() == "quit" {
- exit(0);
- }
-
- // Check if the user wants to change directories
- if verse.verb() == "cd" {
- let path = match verse.clause() {
- Some(path) => path[0].to_string(),
- None => env!("HOME").to_string(),
- };
-
- match std::env::set_current_dir(&path) {
- Ok(_) => continue,
- Err(e) => {
- eprintln!(
- "cd: unable to change into {}: {}",
- path,
- e.to_string().to_lowercase()
- );
- continue;
- }
- }
- }
-
- // Check if the verb exists
- // If it doesn't exist, try refreshing the binary cache, and check
- // again
- // If it still doesn't exist, print an error
- if !verse.spellcheck(bins) {
- *bins = path::refresh(path);
+ // // Check if the user wants to exit the shell
+ // if verse.verb() == "exit" || verse.verb() == "quit" {
+ // exit(0);
+ // }
+ //
+ // // Check if the user wants to change directories
+ // if verse.verb() == "cd" {
+ // let path = match verse.clause() {
+ // Some(path) => path[0].to_string(),
+ // None => env!("HOME").to_string(),
+ // };
+ //
+ // match std::env::set_current_dir(&path) {
+ // Ok(_) => continue,
+ // Err(e) => {
+ // eprintln!(
+ // "cd: unable to change into {}: {}",
+ // path,
+ // e.to_string().to_lowercase()
+ // );
+ // continue;
+ // }
+ // }
+ // }
+
+ // Incant the verse if it's a built-in
+ let index = anthology::lookup(&verse.verb());
+ let status = if index.is_some() {
+ anthology::incant(&verse, index.unwrap(), path, bins)
+ } else {
+ // Incant the verse, based on its meter
+ // Check if the verb exists
+ // If it doesn't exist, try refreshing the binary cache, and check
+ // again
+ // If it still doesn't exist, print an error
if !verse.spellcheck(bins) {
- eprintln!("dwvsh: {}: command not found", verse.verb());
+ *bins = path::refresh(path);
+ if !verse.spellcheck(bins) {
+ eprintln!("dwvsh: {}: command not found", verse.verb());
- if verse.meter != Rune::And {
- continue;
+ if verse.meter != Rune::And {
+ continue;
+ }
}
}
- }
- // Incant the verse, based on its meter
- let status = if stdout {
- match verse.io {
- Rune::Read => Rune::incant_read(&mut verse, &mut out, &mut pids)?,
- Rune::Write => Rune::incant_write(&mut verse, &mut out, &mut pids)?,
- Rune::Addendum => Rune::incant_addendum(&mut verse, &mut out, &mut pids)?,
- _ => match verse.meter {
- Rune::None => Rune::incant_none(&verse, &mut out)?,
- Rune::Couplet => Rune::incant_couplet(&verse, &mut out)?,
- Rune::Quiet => Rune::incant_quiet(&verse, &mut out, &mut pids)?,
- Rune::And => Rune::incant_and(&verse, &mut out)?,
- Rune::Continue => Rune::incant_continue(&verse, &mut out)?,
- _ => unreachable!(),
- },
- }
- } else {
- match verse.io {
- Rune::Read => Rune::incant_read(&mut verse, &mut out, &mut pids)?,
- Rune::Write => Rune::incant_write(&mut verse, &mut out, &mut pids)?,
- Rune::Addendum => Rune::incant_addendum(&mut verse, &mut out, &mut pids)?,
- _ => Rune::incant_couplet(&verse, &mut out)?,
+ if stdout {
+ match verse.io {
+ Rune::Read => Rune::incant_read(&mut verse, &mut out, &mut pids)?,
+ Rune::Write => Rune::incant_write(&mut verse, &mut out, &mut pids)?,
+ Rune::Addendum => Rune::incant_addendum(&mut verse, &mut out, &mut pids)?,
+ _ => match verse.meter {
+ Rune::None => Rune::incant_none(&verse, &mut out)?,
+ Rune::Couplet => Rune::incant_couplet(&verse, &mut out)?,
+ Rune::Quiet => Rune::incant_quiet(&verse, &mut out, &mut pids)?,
+ Rune::And => Rune::incant_and(&verse, &mut out)?,
+ Rune::Continue => Rune::incant_continue(&verse, &mut out)?,
+ _ => unreachable!(),
+ },
+ }
+ } else {
+ match verse.io {
+ Rune::Read => Rune::incant_read(&mut verse, &mut out, &mut pids)?,
+ Rune::Write => Rune::incant_write(&mut verse, &mut out, &mut pids)?,
+ Rune::Addendum => Rune::incant_addendum(&mut verse, &mut out, &mut pids)?,
+ _ => Rune::incant_couplet(&verse, &mut out)?,
+ }
}
};