Есть ли способ скрыть шаблон макроса из документации?

Начиная с Rust 1.6.0, сгенерированная документация скрывает реализацию каждого шаблона макроса:

реализация макроса скрыта

Есть ли способ скрыть некоторые шаблоны из документов, созданных с помощью Cargo?

macro_rules! mc {
    // hide this entire pattern
    (@impl, $arg:expr) => { 42 + $arg };
    // but not this one
    ($arg:expr) => { mc!(@impl, $arg) };
}

2 ответа

Решение

Я думаю, что это оптимальное решение:

/// Not meant to be called directly
#[doc(hidden)]
#[macro_export]
macro_rules! hidden {
    ( $hidden_rule1:expr ) => { ... };
    ( $hidden_rule2:expr ) => { ... };
    ...
}

#[macro_export]
macro_rules! public {
    ( $public:expr ) => ( hidden!($public) );
}

Это использует отдельный hidden макрос (который, вероятно, должен быть общедоступным), но который не является частью документации. Все правила, которые должны быть скрыты, будут скрыты, а общедоступные будут видны в public макрос, который является частью документации.

Один из вариантов - иметь фиктивный макрос только с общедоступным оружием и использовать атрибуты, чтобы выбрать, какой из них увидит rustdoc:

      /// Do a thing
///
/// ```
/// # extern crate my_crate;
/// # use my_crate::mc;
/// assert_eq!(mc!(58), 100);
/// ```
#[cfg(doc)]
#[macro_export]
macro_rules! mc {
    ($arg:expr) => { ... };
}

#[cfg(not(doc))]
#[macro_export]
macro_rules! mc {
    (@impl, $arg:expr) => { 42 + $arg };
    ($arg:expr) => { mc!(@impl, $arg) };
}

Примечание: это будет работать, только если вы не используете макрос внутри.

Другие вопросы по тегам