Я пишу макрос для динамического создания средств форматирования, таких как Display
и Debug
, для заданной структуры, содержащей один универсальный тип. Код следующий:
macro_rules! create_formatters {
($type_name:ident < $gen_param:ident > , $t:path) => {
impl<$gen_param: $t> $t for $type_name<$gen_param> {
fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
let output = match stringify!($t) {
"std::fmt::Display" => format!("{}", self.0),
"std::fmt::Debug" => format!("{:?}", self.0),
// other formatters will be implemented soon
};
write!(f, "Content is: {}", output)
}
}
};
}
Макрос вызывается create_formatters!(MyStruct<T>, std::fmt::Display);
или create_formatters!(MyStruct<T>, std::fmt::Debug);
Компилятор выдает следующую ошибку:
error[E0277]: the trait bound `T: std::fmt::Debug` is not satisfied
--> <anon>:8:58
|
8 | "std::fmt::Debug" => format!("{:?}", self.0),
| ^^^^^^ the trait `std::fmt::Debug` is not implemented for `T`
...
28 | create_formatters!(Swagger<T>, std::fmt::Display);
| -------------------------------------------------- in this macro invocation
|
= help: consider adding a `where T: std::fmt::Debug` bound
= note: required by `std::fmt::Debug::fmt`
Как я могу это исправить?