#[macro_export] /// 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_rules! task { ($verse:expr, $out:expr) => { if $verse.couplet { let mut child = Command::new($verse.verb()) .args($verse.clause()) .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()).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()) .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()) .stdout(Stdio::piped()) .spawn()? } }; }