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 segfault; mod sus; mod time; mod rick; 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) -> Result<(), ShellError>; } const BUILTINS: Lazy)>> = 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)), ("segfault", Box::new(segfault::Segfault)), ("sus", Box::new(sus::Sus)), ("time", Box::new(time::Time)), ("rick", Box::new(rick::Rick)), ] }); 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, ) -> 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_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")) }