mk_lib/
macros.rs

1#[macro_export]
2macro_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    thread::spawn(move || {
9      let reader = BufReader::new(output);
10      for line in reader.lines().map_while(Result::ok) {
11        let _ = multi_clone.println(line);
12      }
13    });
14  };
15}
16
17#[macro_export]
18macro_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]
42macro_rules! get_template_command_value {
43  ($value:expr, $context:expr) => {{
44    let value = $value.trim_start_matches("${{").trim_end_matches("}}").trim();
45    let value = if value.starts_with("env.") {
46      let value = value.trim_start_matches("env.");
47      let value = $context
48        .env_vars
49        .get(value)
50        .ok_or_else(|| anyhow::anyhow!("Failed to find environment variable"))?;
51      value
52    } else {
53      value
54    };
55    value.to_string()
56  }};
57}