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}