Feature request: Allow tt
at format string position #15
Closed
Description
Hi,
At the moment bunt
only allows literals at the format string position. std:println
, however, allows tt
.
Unfortunately, this prevents bunt
users from generating format strings via macros.
For example, I tried the following:
macro_rules! println_with_colored_prefix {
($color:literal, $id:expr, $fmt_str:literal $(, $arg:expr)*) => {
bunt::println!(
concat!("{$", $color, "}[{}][{}]{/$} ", $fmt_str),
BIN.get().expect("Usage before static variable `BIN` set"),
$id
$(, $arg)*
)
};
}
macro_rules! say {
($($arg:expr),+) => {
println_with_colored_prefix!("blue", $($arg),+)
};
}
macro_rules! err {
($($arg:expr),+) => {
println_with_colored_prefix!("red", $($arg),+)
};
}
fn main() {
let name = "foo";
say!(name, "my message.");
err!(name, "my error.");
}
Because concat!("{$", $color, "}[{}][{}]{/$} ", $fmt_str)
isn't a literal, this code doesn't compile.
std
allows this, however (Playground:
macro_rules! my_println {
($fmt_str:literal $(, $arg:expr)*) => {
println!(concat!("my prefix: ", $fmt_str), $(, $arg)*)
};
}
fn main(){
my_println!("foo")
}
From looking at the source code (see links above), it seems bunt
would just have to replace literal
in $format_str:literal
with tt
to support this.
Maybe the tt
would have to be converted to a literal somehow, I'm not sure. The macros above are the only macros I have created so far :)
Metadata
Assignees
Labels
No labels