diff options
Diffstat (limited to 'src/poem/recite.rs')
-rw-r--r-- | src/poem/recite.rs | 120 |
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)?, + } } }; |