From fc3449b2f10fb6dbb8945f05d55353b41b818345 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 26 Dec 2021 02:35:27 -0500 Subject: couple more builtins --- src/state/history/builtins.rs | 26 ++++++++++++++++++++++++++ src/state/history/mod.rs | 9 ++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/state/history/builtins.rs b/src/state/history/builtins.rs index 1bf9d00..e999035 100644 --- a/src/state/history/builtins.rs +++ b/src/state/history/builtins.rs @@ -43,6 +43,14 @@ static BUILTINS: once_cell::sync::Lazy< builtins .insert("and", coerce_builtin(&|exe, env| Box::pin(and(exe, env)))); builtins.insert("or", coerce_builtin(&|exe, env| Box::pin(or(exe, env)))); + builtins.insert( + "command", + coerce_builtin(&|exe, env| Box::pin(command(exe, env))), + ); + builtins.insert( + "builtin", + coerce_builtin(&|exe, env| Box::pin(builtin(exe, env))), + ); builtins }); @@ -129,6 +137,24 @@ async fn or( *env.latest_status() } +async fn command( + exe: &crate::parse::Exe, + env: &super::ProcessEnv, +) -> async_std::process::ExitStatus { + let exe = exe.shift(); + super::run_binary(&exe, env).await; + *env.latest_status() +} + +async fn builtin( + exe: &crate::parse::Exe, + env: &super::ProcessEnv, +) -> async_std::process::ExitStatus { + let exe = exe.shift(); + run(&exe, env).await; + *env.latest_status() +} + fn home() -> std::path::PathBuf { std::env::var_os("HOME").unwrap().into() } diff --git a/src/state/history/mod.rs b/src/state/history/mod.rs index e198ba3..1df2f67 100644 --- a/src/state/history/mod.rs +++ b/src/state/history/mod.rs @@ -637,9 +637,16 @@ async fn run_exe( env: &ProcessEnv, ) -> async_std::process::ExitStatus { if let Some(status) = builtins::run(exe, env).await { - return status; + status + } else { + run_binary(exe, env).await } +} +async fn run_binary( + exe: &crate::parse::Exe, + env: &ProcessEnv, +) -> async_std::process::ExitStatus { let mut process = async_std::process::Command::new(exe.exe()); process.args(exe.args()); let size = env.entry().await.vt.screen().size(); -- cgit v1.2.3-54-g00ecf