#[cfg(doc)]
use crate::{FmtNum, Slice};
#[doc = crate::_tags!(fmt)]
#[doc = crate::_doc_location!("text/fmt")]
#[macro_export]
#[cfg_attr(cargo_primary_package, doc(hidden))]
macro_rules! fmtcat {
($buf:ident, $offset:ident, $($elem:tt)*) => {{
let mut pos = $offset;
$crate::fmtcat!(@proc $buf, pos, $($elem)*);
$offset = pos;
}};
($buf:ident, $offset:literal, $($elem:tt)*) => {{
let mut pos = $offset;
$crate::fmtcat!(@proc $buf, pos, $($elem)*);
}};
(@proc $buf:ident, $pos:ident $(,)?) => {};
(@proc $buf:ident, $pos:ident, $lit:literal , $($rest:tt)*) => {{
$pos += $crate::Slice::copy_str_into(&mut $buf, $pos, $lit);
$crate::fmtcat!(@proc $buf, $pos, $($rest)*);
}};
(@proc $buf:ident, $pos:ident, $lit:literal) => {{
$pos += $crate::Slice::copy_str_into(&mut $buf, $pos, $lit);
}};
(@proc $buf:ident, $pos:ident, %$num:expr , $($rest:tt)*) => {{
$pos += $crate::FmtNum($num).write(&mut $buf, $pos);
$crate::fmtcat!(@proc $buf, $pos, $($rest)*);
}};
(@proc $buf:ident, $pos:ident, %$num:expr) => {{
$pos += $crate::FmtNum($num).write(&mut $buf, $pos);
}};
(@proc $buf:ident, $pos:ident, @$s:expr, $($rest:tt)*) => {{
$pos += $crate::Slice::copy_utf8_into(&mut $buf, $pos, $s.as_bytes());
$crate::fmtcat!(@proc $buf, $pos, $($rest)*);
}};
(@proc $buf:ident, $pos:ident, @$s:expr) => {{
$pos += $crate::Slice::copy_utf8_into(&mut $buf, $pos, $s.as_bytes());
}};
}
pub use fmtcat;
#[cfg(test)]
mod tests {
#[test]
fn fmtargs() {
let name = "Alice";
let score = 42u8;
let mut buf = [0u8; 64];
let mut pos = 0;
fmtcat!(buf, pos,
"Hello ", @name, ", score=", %score, "!\n"
);
assert_eq!(&buf[..pos], b"Hello Alice, score=42!\n");
fmtcat!(buf, pos, "Bye ", @name, "!");
assert_eq!(&buf[..pos], b"Hello Alice, score=42!\nBye Alice!");
}
}