diff options
Diffstat (limited to 'src/runner/builtins/mod.rs')
-rw-r--r-- | src/runner/builtins/mod.rs | 116 |
1 files changed, 35 insertions, 81 deletions
diff --git a/src/runner/builtins/mod.rs b/src/runner/builtins/mod.rs index 5205856..b714c58 100644 --- a/src/runner/builtins/mod.rs +++ b/src/runner/builtins/mod.rs @@ -7,7 +7,7 @@ type Builtin = &'static (dyn for<'a> Fn( crate::parse::Exe, &'a Env, command::Cfg, -) -> anyhow::Result<command::Child<'a>> +) -> Result<command::Child> + Sync + Send); @@ -33,7 +33,6 @@ macro_rules! bail { $cfg.io().write_stderr( format!("{}: {}\n", $exe.exe().display(), $msg).as_bytes() ) - .await .unwrap(); return std::process::ExitStatus::from_raw(1 << 8); }; @@ -41,12 +40,10 @@ macro_rules! bail { $cfg.io().write_stderr( format!("{}: ", $exe.exe().display()).as_bytes() ) - .await .unwrap(); $cfg.io().write_stderr(format!($msg, $($arg)*).as_bytes()) - .await .unwrap(); - $cfg.io().write_stderr(b"\n").await.unwrap(); + $cfg.io().write_stderr(b"\n").unwrap(); return std::process::ExitStatus::from_raw(1 << 8); }; } @@ -57,22 +54,20 @@ fn cd( exe: crate::parse::Exe, env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { - async fn async_cd( - exe: crate::parse::Exe, - env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { +) -> Result<command::Child> { + let prev_pwd = env.prev_pwd(); + let home = env.var("HOME"); + Ok(command::Child::new_task(move || { let dir = if let Some(dir) = exe.args().get(0) { if dir.is_empty() { ".".to_string().into() } else if dir == "-" { - env.prev_pwd() + prev_pwd } else { dir.into() } } else { - let dir = env.var("HOME"); + let dir = home; if let Some(dir) = dir { dir.into() } else { @@ -88,25 +83,17 @@ fn cd( dir.display() ); } - async_std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_cd(exe, env, cfg).await + std::process::ExitStatus::from_raw(0) })) } #[allow(clippy::unnecessary_wraps)] fn set( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { - async fn async_set( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { +) -> Result<command::Child> { + Ok(command::Child::new_task(move || { let k = if let Some(k) = exe.args().get(0).map(String::as_str) { k } else { @@ -119,25 +106,17 @@ fn set( }; std::env::set_var(k, v); - async_std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_set(exe, env, cfg).await + std::process::ExitStatus::from_raw(0) })) } #[allow(clippy::unnecessary_wraps)] fn unset( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { - async fn async_unset( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { +) -> Result<command::Child> { + Ok(command::Child::new_task(move || { let k = if let Some(k) = exe.args().get(0).map(String::as_str) { k } else { @@ -145,11 +124,7 @@ fn unset( }; std::env::remove_var(k); - async_std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_unset(exe, env, cfg).await + std::process::ExitStatus::from_raw(0) })) } @@ -159,22 +134,17 @@ fn unset( // this later, since the binary seems totally fine fn echo( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { - async fn async_echo( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { +) -> Result<command::Child> { + Ok(command::Child::new_task(move || { macro_rules! write_stdout { ($bytes:expr) => { - if let Err(e) = cfg.io().write_stdout($bytes).await { + if let Err(e) = cfg.io().write_stdout($bytes) { cfg.io() .write_stderr(format!("echo: {}", e).as_bytes()) - .await .unwrap(); - return async_std::process::ExitStatus::from_raw(1 << 8); + return std::process::ExitStatus::from_raw(1 << 8); } }; } @@ -188,32 +158,24 @@ fn echo( } } - async_std::process::ExitStatus::from_raw(0) - } - - Ok(command::Child::new_fut(async move { - async_echo(exe, env, cfg).await + std::process::ExitStatus::from_raw(0) })) } #[allow(clippy::unnecessary_wraps)] fn read( exe: crate::parse::Exe, - env: &Env, + _env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { - async fn async_read( - exe: crate::parse::Exe, - _env: &Env, - cfg: command::Cfg, - ) -> std::process::ExitStatus { +) -> Result<command::Child> { + Ok(command::Child::new_task(move || { let var = if let Some(var) = exe.args().get(0).map(String::as_str) { var } else { bail!(cfg, exe, "usage: read var"); }; - let (val, done) = match cfg.io().read_line_stdin().await { + let (val, done) = match cfg.io().read_line_stdin() { Ok((line, done)) => (line, done), Err(e) => { bail!(cfg, exe, e); @@ -221,15 +183,7 @@ fn read( }; std::env::set_var(var, val); - async_std::process::ExitStatus::from_raw(if done { - 1 << 8 - } else { - 0 - }) - } - - Ok(command::Child::new_fut(async move { - async_read(exe, env, cfg).await + std::process::ExitStatus::from_raw(if done { 1 << 8 } else { 0 }) })) } @@ -237,7 +191,7 @@ fn and( mut exe: crate::parse::Exe, env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { +) -> Result<command::Child> { exe.shift(); if env.latest_status().success() { let mut cmd = crate::runner::Command::new(exe, cfg.io().clone()); @@ -245,7 +199,7 @@ fn and( Ok(command::Child::new_wrapped(cmd.spawn(env)?)) } else { let status = env.latest_status(); - Ok(command::Child::new_fut(async move { status })) + Ok(command::Child::new_task(move || status)) } } @@ -253,11 +207,11 @@ fn or( mut exe: crate::parse::Exe, env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { +) -> Result<command::Child> { exe.shift(); if env.latest_status().success() { let status = env.latest_status(); - Ok(command::Child::new_fut(async move { status })) + Ok(command::Child::new_task(move || status)) } else { let mut cmd = crate::runner::Command::new(exe, cfg.io().clone()); cfg.setup_command(&mut cmd); @@ -269,9 +223,9 @@ fn command( mut exe: crate::parse::Exe, env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { +) -> Result<command::Child> { exe.shift(); - let mut cmd = crate::runner::Command::new_binary(exe); + let mut cmd = crate::runner::Command::new_binary(&exe); cfg.setup_command(&mut cmd); Ok(command::Child::new_wrapped(cmd.spawn(env)?)) } @@ -280,7 +234,7 @@ fn builtin( mut exe: crate::parse::Exe, env: &Env, cfg: command::Cfg, -) -> anyhow::Result<command::Child> { +) -> Result<command::Child> { exe.shift(); let mut cmd = crate::runner::Command::new_builtin(exe, cfg.io().clone()); cfg.setup_command(&mut cmd); |