summaryrefslogtreecommitdiffstats
path: root/src/poem/recite/ps.rs
blob: 5700ae8aba1ff71d188bd6013ee44762393755f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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)?;
            $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)?;
            $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)?;
            $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)?;
            $out.clear();

            child
        } else {
            Command::new($verse.verb())
                .args($verse.clause().unwrap_or(vec![]))
                .stdout(Stdio::piped())
                .process_group(0)
                .spawn()?
        }
    };
}