summaryrefslogtreecommitdiffstats
path: root/src/runner/builtins/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/runner/builtins/mod.rs')
-rw-r--r--src/runner/builtins/mod.rs80
1 files changed, 19 insertions, 61 deletions
diff --git a/src/runner/builtins/mod.rs b/src/runner/builtins/mod.rs
index 87b5ae7..f212496 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>>
+) -> anyhow::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);
};
}
@@ -58,21 +55,19 @@ fn cd(
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 {
+ 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 {
@@ -89,24 +84,16 @@ fn cd(
);
}
std::process::ExitStatus::from_raw(0)
- }
-
- Ok(command::Child::new_fut(async move {
- async_cd(exe, env, cfg).await
}))
}
#[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 {
+ Ok(command::Child::new_task(move || {
let k = if let Some(k) = exe.args().get(0).map(String::as_str) {
k
} else {
@@ -120,24 +107,16 @@ fn set(
std::env::set_var(k, v);
std::process::ExitStatus::from_raw(0)
- }
-
- Ok(command::Child::new_fut(async move {
- async_set(exe, env, cfg).await
}))
}
#[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 {
+ Ok(command::Child::new_task(move || {
let k = if let Some(k) = exe.args().get(0).map(String::as_str) {
k
} else {
@@ -146,10 +125,6 @@ fn unset(
std::env::remove_var(k);
std::process::ExitStatus::from_raw(0)
- }
-
- Ok(command::Child::new_fut(async move {
- async_unset(exe, env, cfg).await
}))
}
@@ -159,20 +134,15 @@ 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 {
+ 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 std::process::ExitStatus::from_raw(1 << 8);
}
@@ -189,31 +159,23 @@ fn echo(
}
std::process::ExitStatus::from_raw(0)
- }
-
- Ok(command::Child::new_fut(async move {
- async_echo(exe, env, cfg).await
}))
}
#[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 {
+ 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);
@@ -222,10 +184,6 @@ fn read(
std::env::set_var(var, val);
std::process::ExitStatus::from_raw(if done { 1 << 8 } else { 0 })
- }
-
- Ok(command::Child::new_fut(async move {
- async_read(exe, env, cfg).await
}))
}
@@ -241,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,7 +211,7 @@ fn or(
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);