diff options
Diffstat (limited to 'src/recite')
-rw-r--r-- | src/recite/erro.rs | 15 | ||||
-rw-r--r-- | src/recite/ps.rs | 71 |
2 files changed, 86 insertions, 0 deletions
diff --git a/src/recite/erro.rs b/src/recite/erro.rs new file mode 100644 index 0000000..00f57b3 --- /dev/null +++ b/src/recite/erro.rs @@ -0,0 +1,15 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +pub enum Mishap { + #[error("broken pipe: {0}")] + BrokenPipe(String), + // #[error("exec format error: {0}")] + // ExecFormat(String), + #[error("permission denied: {0}")] + PermissionDenied(String), + #[error("terminated: {0}")] + Terminated(String), + #[error("exec error: {0}")] + Else(String), +} diff --git a/src/recite/ps.rs b/src/recite/ps.rs new file mode 100644 index 0000000..3557505 --- /dev/null +++ b/src/recite/ps.rs @@ -0,0 +1,71 @@ +#[macro_export] +macro_rules! task { + ($verse:expr, $out:expr) => { + if $verse.couplet { + let mut child = Command::new($verse.verb()) + .args($verse.clause()) + .stdin(Stdio::piped()) + .spawn() + .map_err(|e| match e.kind() { + io::ErrorKind::PermissionDenied => Mishap::PermissionDenied($verse.verb()), + _ => Mishap::Else($verse.verb()), + })?; + + let stdin = child + .stdin + .as_mut() + .ok_or(Mishap::BrokenPipe($verse.verb()))?; + stdin + .write_all(&$out.as_bytes()) + .map_err(|_| Mishap::BrokenPipe($verse.verb()))?; + $out.clear(); + + child + } else { + Command::new($verse.verb()) + .args($verse.clause()) + .spawn() + .map_err(|e| match e.kind() { + io::ErrorKind::PermissionDenied => Mishap::PermissionDenied($verse.verb()), + _ => Mishap::Else($verse.verb()), + })? + } + }; +} + +#[macro_export()] +macro_rules! ctask { + ($verse:expr, $out:expr) => { + if $verse.couplet { + let mut child = Command::new($verse.verb()) + .args($verse.clause()) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + .map_err(|e| match e.kind() { + io::ErrorKind::PermissionDenied => Mishap::PermissionDenied($verse.verb()), + _ => Mishap::Else($verse.verb()), + })?; + + let stdin = child + .stdin + .as_mut() + .ok_or(Mishap::BrokenPipe($verse.verb()))?; + stdin + .write_all(&$out.as_bytes()) + .map_err(|_| Mishap::BrokenPipe($verse.verb()))?; + $out.clear(); + + child + } else { + Command::new($verse.verb()) + .args($verse.clause()) + .stdout(Stdio::piped()) + .spawn() + .map_err(|e| match e.kind() { + io::ErrorKind::PermissionDenied => Mishap::PermissionDenied($verse.verb()), + _ => Mishap::Else($verse.verb()), + })? + } + }; +} |