1
#[macro_export]
2
macro_rules! handle_output {
3
  ($output:expr, $context:expr) => {
4
    let output = $output
5
      .take()
6
      .with_context(|| format!("Failed to open {}", stringify!($output)))?;
7
    let multi_clone = $context.multi.clone();
8
56
    thread::spawn(move || {
9
56
      let reader = BufReader::new(output);
10
56
      for line in reader.lines().map_while(Result::ok) {
11
28
        let _ = multi_clone.println(line);
12
28
      }
13
56
    });
14
  };
15
}
16

            
17
#[macro_export]
18
macro_rules! run_shell_command {
19
  ($value:expr, $cmd:expr, $verbose:expr) => {{
20
    let arg = $value.trim_start_matches("$(").trim_end_matches(")");
21
    let stdout = if $verbose {
22
      std::process::Stdio::piped()
23
    } else {
24
      std::process::Stdio::null()
25
    };
26

            
27
    let mut child = $cmd.arg(arg).stdout(stdout).spawn()?;
28
    let stdout = child
29
      .stdout
30
      .take()
31
      .ok_or_else(|| anyhow::anyhow!("Failed to open stdout"))?;
32
    let buf = std::io::BufReader::new(stdout);
33
    let output = buf
34
      .lines()
35
      .next()
36
      .ok_or_else(|| anyhow::anyhow!("Failed to read stdout"))??;
37
    output
38
  }};
39
}
40

            
41
#[macro_export]
42
macro_rules! get_template_command_value {
43
  ($value:expr, $context:expr) => {{
44
    $crate::schema::resolve_template_command_value($value, $context)?
45
  }};
46
}