From e4b03cdd4f1ba9daf3095930911b12fb28b6a248 Mon Sep 17 00:00:00 2001
From: "a.stevan" <antoine.stevan@isae-supaero.fr>
Date: Thu, 3 Apr 2025 11:12:59 +0200
Subject: [PATCH] add support for env in macros

---
 example.rs | 13 ++++---------
 src/lib.rs | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/example.rs b/example.rs
index dddc400..b5b2c0f 100755
--- a/example.rs
+++ b/example.rs
@@ -24,16 +24,11 @@ fn main() {
     println!("    => i'm here even if a command fails");
     println!("");
 
-    nob::_run_cmd("echo", vec!["-n", "VAR without env: "], vec![], false);
-    nob::_run_cmd("printenv", vec!["VAR"], vec![], false);
+    nob::run_cmd!(@"echo", "-n", "VAR and ANOTHER without env: ");
+    nob::run_cmd!(@"printenv", "VAR", "ANOTHER");
     println!("");
-    nob::_run_cmd("echo", vec!["-n", "VAR with    env: "], vec![], false);
-    nob::_run_cmd(
-        "printenv",
-        vec!["VAR"],
-        vec![("VAR", "i'm a variable")],
-        false,
-    );
+    nob::run_cmd!(@"echo", "-n", "VAR and ANOTHER with    env: ");
+    nob::run_cmd!(@"printenv", "VAR", "ANOTHER" ; "VAR" => "i'm a variable", "ANOTHER" => "me too");
     println!("");
 
     nob::run_cmd_and_fail!("ls", "djawkldjwla");
diff --git a/src/lib.rs b/src/lib.rs
index 2eb7439..a8d95f2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -32,9 +32,15 @@ macro_rules! run_cmd {
     ($cmd:expr $(, $args:expr)*) => {{
         nob::_run_cmd($cmd, vec![$($args),*], vec![], true)
     }};
+    ($cmd:expr $(, $args:expr)* ; $($k:expr => $v:expr),*) => {{
+        nob::_run_cmd($cmd, vec![$($args),*], vec![$(($k, $v),)*], true)
+    }};
     (@$cmd:expr $(, $args:expr)*) => {{
         nob::_run_cmd($cmd, vec![$($args),*], vec![], false)
     }};
+    (@$cmd:expr $(, $args:expr)* ; $($k:expr => $v:expr),*) => {{
+        nob::_run_cmd($cmd, vec![$($args),*], vec![$(($k, $v),)*], false)
+    }};
 }
 
 #[macro_export]
@@ -42,9 +48,15 @@ macro_rules! run_cmd_and_fail {
     ($cmd:expr $(, $args:expr)*) => {{
         nob::pass_or_fail(nob::_run_cmd($cmd, vec![$($args),*], vec![], true))
     }};
+    ($cmd:expr $(, $args:expr)* ; $($k:expr => $v:expr),*) => {{
+        nob::pass_or_fail(nob::_run_cmd($cmd, vec![$($args),*], vec![$(($k, $v),)*], true))
+    }};
     (@$cmd:expr $(, $args:expr)*) => {{
         nob::pass_or_fail(nob::_run_cmd($cmd, vec![$($args),*], vec![], false))
     }};
+    (@$cmd:expr $(, $args:expr)* ; $($k:expr => $v:expr),*) => {{
+        nob::pass_or_fail(nob::_run_cmd($cmd, vec![$($args),*], vec![$(($k, $v),)*], false))
+    }};
 }
 
 #[macro_export]
@@ -54,11 +66,21 @@ macro_rules! run_cmd_as_vec {
         let cmd_name = iter.next().expect("no command specified");
         nob::_run_cmd(cmd_name, iter.collect::<Vec<_>>(), vec![], true)
     }};
+    ($cmd_and_args:expr ; $($k:expr => $v:expr),*) => {{
+        let mut iter = $cmd_and_args.into_iter();
+        let cmd_name = iter.next().expect("no command specified");
+        nob::_run_cmd(cmd_name, iter.collect::<Vec<_>>(), vec![$(($k, $v),)*], true)
+    }};
     (@$cmd_and_args:expr) => {{
         let mut iter = $cmd_and_args.into_iter();
         let cmd_name = iter.next().expect("no command specified");
         nob::_run_cmd(cmd_name, iter.collect::<Vec<_>>(), vec![], false)
     }};
+    (@$cmd_and_args:expr ; $($k:expr => $v:expr),*) => {{
+        let mut iter = $cmd_and_args.into_iter();
+        let cmd_name = iter.next().expect("no command specified");
+        nob::_run_cmd(cmd_name, iter.collect::<Vec<_>>(), vec![$(($k, $v),)*], false)
+    }};
 }
 
 #[macro_export]
@@ -73,6 +95,11 @@ macro_rules! run_cmd_as_vec_and_fail {
             true,
         ))
     }};
+    ($cmd_and_args:expr ; $($k:expr => $v:expr),*) => {{
+        let mut iter = $cmd_and_args.into_iter();
+        let cmd_name = iter.next().expect("no command specified");
+        nob::pass_or_fail(nob::_run_cmd(cmd_name, iter.collect::<Vec<_>>(), vec![$(($k, $v),)*], true))
+    }};
     (@$cmd_and_args:expr) => {{
         let mut iter = $cmd_and_args.into_iter();
         let cmd_name = iter.next().expect("no command specified");
@@ -83,4 +110,9 @@ macro_rules! run_cmd_as_vec_and_fail {
             false,
         ))
     }};
+    (@$cmd_and_args:expr ; $($k:expr => $v:expr),*) => {{
+        let mut iter = $cmd_and_args.into_iter();
+        let cmd_name = iter.next().expect("no command specified");
+        nob::pass_or_fail(nob::_run_cmd(cmd_name, iter.collect::<Vec<_>>(), vec![$(($k, $v),)*], false))
+    }};
 }
-- 
GitLab