summaryrefslogtreecommitdiffstats
path: root/src/poem/recite
diff options
context:
space:
mode:
Diffstat (limited to 'src/poem/recite')
-rw-r--r--src/poem/recite/ps.rs134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/poem/recite/ps.rs b/src/poem/recite/ps.rs
new file mode 100644
index 0000000..61ed66d
--- /dev/null
+++ b/src/poem/recite/ps.rs
@@ -0,0 +1,134 @@
+/// Fork into a process from a Verse
+///
+/// Figures out whether or not the given Verse is a couplet. If it is, fork
+/// into a process, and pipe the contents of out `out` into STDIN. If not, then
+/// simply fork into the process.
+///
+/// # Arguments
+/// * `$verse: &Verse` - The verse to fork into
+/// * `$out: &mut String` - If the $verse is a couplet, the contents of STDOUT from the last verse
+#[macro_export]
+macro_rules! task {
+ ($verse:expr, $out:expr) => {
+ if $verse.couplet {
+ let mut child = Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .stdin(Stdio::piped())
+ .spawn()?;
+
+ let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?;
+ stdin.write_all(&$out.as_bytes())?;
+ $out.clear();
+
+ child
+ } else {
+ Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .spawn()?
+ }
+ };
+}
+
+/// Fork into a process from a Verse, and capture STDOUT
+///
+/// Figures out whether or not the given Verse is a couplet. If it is, fork
+/// into a process, and pipe the contents of out `out` into STDIN. If not, then
+/// simply fork into the process. Additionally, this function will capture
+/// STDOUT of the process specified by the Verse, and store it in `out`.
+///
+/// # Arguments
+/// * `$verse: &Verse` - The verse to fork into
+/// * `$out: &mut String` - If the $verse is a couplet, the contents of STDOUT from the last verse
+#[macro_export]
+macro_rules! ctask {
+ ($verse:expr, $out:expr) => {
+ if $verse.couplet {
+ let mut child = Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .spawn()?;
+
+ let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?;
+ stdin.write_all(&$out.as_bytes())?;
+ $out.clear();
+
+ child
+ } else {
+ Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .stdout(Stdio::piped())
+ .spawn()?
+ }
+ };
+}
+
+/// Fork into a background process from a Verse
+///
+/// Figures out whether or not the given Verse is a couplet. If it is, fork
+/// into a backgournd process, and pipe the contents of out `out` into STDIN.
+/// If not, then simply fork into the background process.
+///
+/// # Arguments
+/// * `$verse: &Verse` - The verse to fork into
+/// * `$out: &mut String` - If the $verse is a couplet, the contents of STDOUT from the last verse
+#[macro_export]
+macro_rules! btask {
+ ($verse:expr, $out:expr) => {
+ if $verse.couplet {
+ let mut child = Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .stdin(Stdio::piped())
+ .process_group(0)
+ .spawn()?;
+
+ let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?;
+ stdin.write_all(&$out.as_bytes())?;
+ $out.clear();
+
+ child
+ } else {
+ Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .process_group(0)
+ .spawn()?
+ }
+ };
+}
+
+/// Fork into a background process from a Verse, and capture STDOUT
+///
+/// Figures out whether or not the given Verse is a couplet. If it is, fork
+/// into a backgournd process, and pipe the contents of out `out` into STDIN.
+/// If not, then simply fork into the background process. This captures the
+/// output of STDOUT, in order to redirect it to a file when the program
+/// finishes running.
+///
+/// # Arguments
+/// * `$verse: &Verse` - The verse to fork into
+/// * `$out: &mut String` - If the $verse is a couplet, the contents of STDOUT from the last verse
+#[macro_export]
+macro_rules! iobtask {
+ ($verse:expr, $out:expr) => {
+ if $verse.couplet {
+ let mut child = Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .stdin(Stdio::piped())
+ .stdout(Stdio::piped())
+ .process_group(0)
+ .spawn()?;
+
+ let stdin = child.stdin.as_mut().ok_or(io::ErrorKind::BrokenPipe)?;
+ stdin.write_all(&$out.as_bytes())?;
+ $out.clear();
+
+ child
+ } else {
+ Command::new($verse.verb())
+ .args($verse.clause().unwrap_or(vec![]))
+ .stdout(Stdio::piped())
+ .process_group(0)
+ .spawn()?
+ }
+ };
+}