#[macro_export]
macro_rules! push_all {
($s:expr $(,)?) => {};
($s:expr, # $ch:literal $(, $($rest:tt)*)?) => {
$s.push($ch);
$crate::push_all!($s $(, $($rest)*)?);
};
($s:expr, @ $num:expr $(, $($rest:tt)*)?) => {
{
use ::std::fmt::Write;
let _ = write!($s, "{}", $num);
}
$crate::push_all!($s $(, $($rest)*)?);
};
($s:expr, $item:expr $(, $($rest:tt)*)?) => {
$s.push_str($item);
$crate::push_all!($s $(, $($rest)*)?);
};
}
#[macro_export]
macro_rules! push_line {
($s:expr $(, $($items:tt)*)?) => {
$crate::push_all!($s $(, $($items)*)?);
$s.push('\n');
};
}
#[cfg(test)]
mod tests {
#[test]
fn test_push_all_strings() {
let mut s = std::string::String::new();
push_all!(s, "Hello", ", ", "world", "!");
assert_eq!(s, "Hello, world!");
}
#[test]
fn test_push_all_with_char() {
let mut s = std::string::String::new();
push_all!(s, "a", #':', "b");
assert_eq!(s, "a:b");
}
#[test]
fn test_push_all_with_number() {
let mut s = std::string::String::new();
let n = 42u32;
push_all!(s, "count: ", @n);
assert_eq!(s, "count: 42");
}
#[test]
fn test_push_all_mixed() {
let mut s = std::string::String::new();
let start = 10usize;
let end = 20usize;
push_all!(s, "range: ", @start, #':', @end);
assert_eq!(s, "range: 10:20");
}
#[test]
fn test_push_line() {
let mut s = std::string::String::new();
push_line!(s, "Hello");
push_line!(s, "World");
assert_eq!(s, "Hello\nWorld\n");
}
#[test]
fn test_push_all_empty() {
let s = std::string::String::from("start");
push_all!(s);
assert_eq!(s, "start");
}
}