summaryrefslogtreecommitdiffstats
path: root/src/recite/ps.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/recite/ps.rs')
-rw-r--r--src/recite/ps.rs71
1 files changed, 71 insertions, 0 deletions
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()),
+ })?
+ }
+ };
+}