/// 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()? } }; }