Кто-то показал мне хорошее решение для этого внутреннего потока , в котором используется макрос. Я изменил макрос, чтобы сделать его более приятным для использования.
Использование:
macro_rules! gen_functions {
($name:tt) => {
doc! {
/// # Usage
///
/// ```
[concat!(" let h = ", $name, " {};")]
/// h.test_a();
/// ```
@ pub fn test_a(&self) {
println!("test a")
}
}
};
}
А это макрос:
macro_rules! doc {
{
$(#[$m:meta])*
$(
[$doc:expr]
$(#[$n:meta])*
)*
@ $thing:item
} => {
$(#[$m])*
$(
#[doc = $doc]
$(#[$n])*
)*
$thing
}
}
Макрос преобразует строки в [
квадратные скобки ]
в #[doc = _]
атрибуты. Что делает его особенным, так это то, что он может содержать concat! и stringify! макро-вызовы. Их также можно комбинировать, например
doc! {
/// # Usage
///
/// ```
[concat!(" let ", stringify!(h), " = ", stringify!(CustomStruct), " {};")]
/// h.test_a();
/// ```
@ pub fn test_a(&self) {
println!("test a")
}
}