Ответ 1
Возможно захватить комментарии документа в вызовах макроса. Это не широко известно, но документация Rust фактически представлена как особый вид атрибута для элемента. Например:
/// Some documentation comment
pub fn function() {}
// is equivalent to
#[doc="Some documentation comment"]
pub fn function() {}
И можно захватывать атрибуты в макросах. Уже есть несколько макросов, которые используют эту способность, наиболее часто используемыми являются bitflags!
:
macro_rules! bitflags {
(
$(#[$outer:meta])*
pub struct $BitFlags:ident: $T:ty {
$(
$(#[$inner:ident $($args:tt)*])*
const $Flag:ident = $value:expr;
)+
}
) => { /* ... */ };
// ...
}
Обратите внимание на части шаблона $(#[$outer:meta])*
и $(#[$inner:meta])*
. Они захватывают все атрибуты, помещенные перед соответствующим элементом в шаблоне. Если вы напишите там комментарий к документу, он будет преобразован в атрибут документа и будет передан rustdoc, как обычно.
Ниже приведен пример из ящика quick_error
который также использует этот подход:
quick_error! {
#[derive(Debug)]
pub enum SomeError {
/// IO Error
Io(err: io::Error) {}
/// Arbitrary system error
Sys(errno: nix::Errno) {}
}
}
Это работает - вот пример структуры, сгенерированной quick_error
, и вот ее определение.