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.
157 lines
3.1 KiB
157 lines
3.1 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 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<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)),
|
|
("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<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_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"))
|
|
}
|
|
|