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.rs116
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);