You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

162 lines
3.2 KiB

use crate::error::ShellError;
use crate::prompt::PromptStyle;
use once_cell::unsync::Lazy;
mod blahaj;
mod cd;
mod change_prompt;
mod exit;
mod fetch;
mod help;
mod logout;
mod ls;
mod open;
mod pwd;
mod quote;
mod rick;
mod segfault;
mod sus;
mod time;
pub struct BuiltinConfig {
pub prompt_style: PromptStyle,
}
impl BuiltinConfig {
pub fn new() -> Self {
Self {
prompt_style: PromptStyle::Default,
}
}
}
trait Builtin: Sync + Send {
fn execute(&mut self, config: &mut BuiltinConfig, args: Vec<String>) -> Result<(), ShellError>;
}
const BUILTINS: Lazy<Vec<(&str, Box<dyn Builtin>)>> = Lazy::new(|| {
vec![
("blahaj", Box::new(blahaj::Blahaj)),
("cd", Box::new(cd::Cd)),
("change-prompt", Box::new(change_prompt::ChangePrompt)),
("exit", Box::new(exit::Exit)),
("fetch", Box::new(fetch::Fetch)),
("help", Box::new(help::Help)),
("logout", Box::new(logout::Logout)),
("ls", Box::new(ls::Ls)),
("open", Box::new(open::Open)),
("pwd", Box::new(pwd::Pwd)),
("quote", Box::new(quote::Quote)),
("rick", Box::new(rick::Rick)),
("segfault", Box::new(segfault::Segfault)),
("sus", Box::new(sus::Sus)),
("time", Box::new(time::Time)),
]
});
pub fn is_builtin(keyword: &str) -> bool {
BUILTINS.iter().find(|(k, _)| k == &keyword).is_some()
}
#[allow(const_item_mutation)]
pub fn execute_builtin(
keyword: &str,
config: &mut BuiltinConfig,
args: Vec<String>,
) -> Result<(), ShellError> {
if let Some(builtin) = BUILTINS
.iter_mut()
.find_map(|(k, c)| if k == &keyword { Some(c) } else { None })
{
builtin.execute(config, args)?
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_builtin_blahaj(){
assert!(is_builtin("blahaj"));
}
}
#[test]
fn test_is_builtin_cd() {
assert!(is_builtin("cd"));
}
#[test]
fn test_is_builtin_change_prompt() {
assert!(is_builtin("change-prompt"));
}
#[test]
fn test_is_builtin_exit() {
assert!(is_builtin("exit"));
}
#[test]
fn test_is_builtin_fetch() {
assert!(is_builtin("fetch"));
}
#[test]
fn test_is_builtin_help() {
assert!(is_builtin("help"));
}
#[test]
fn test_is_builtin_logout() {
assert!(is_builtin("logout"))
}
#[test]
fn test_is_builtin_ls() {
assert!(is_builtin("ls"));
}
#[test]
fn test_is_builtin_open() {
assert!(is_builtin("open"));
}
#[test]
fn test_is_builtin_pwd() {
assert!(is_builtin("pwd"));
}
#[test]
fn test_is_builtin_quote() {
assert!(is_builtin("quote"));
}
#[test]
fn test_is_builtin_rick(){
assert!(is_builtin("rick"));
}
#[test]
fn test_is_builtin_segfault() {
assert!(is_builtin("segfault"));
}
#[test]
fn test_is_builtin_sus() {
assert!(is_builtin("sus"));
}
#[test]
fn test_is_builtin_time() {
assert!(is_builtin("time"));
}
#[test]
fn test_is_builtin_notabuiltin() {
assert!(!is_builtin("notabuiltin"))
}