summaryrefslogtreecommitdiffstats
path: root/src/recite
diff options
context:
space:
mode:
Diffstat (limited to 'src/recite')
-rw-r--r--src/recite/erro.rs15
-rw-r--r--src/recite/ps.rs71
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()),
+ })?
+ }
+ };
+}