Search code examples
macrosdocumentationrust

How to embed a Rust macro variable into documentation?


I'd like to use a macro variable in the macro-generated documentation:

macro_rules! impl_foo {
    ($name:ident) => {
        /// Returns a new `$name`.
        fn myfoo() -> $name {

        }
    };
}

However, the variable won't be substituted. I also tried using the #[doc] attribute:

macro_rules! impl_foo {
    ($name:ident) => {
        #[doc = concat!("Returns a new `", $name, "`.")]
        fn myfoo() -> $name {

        }
    };
}

This one even fails to parse: unexpected token: 'concat'


Solution

  • This can be done using a recursive macro:

    macro_rules! impl_foo {
        ($name:ident, $sname:expr) => {
            #[doc = "Returns a new `"]
            #[doc = $sname]
            #[doc = "`."]
            pub fn myfoo() -> $name {
                42
            }
        };
    
        ($name:tt) => {
            impl_foo!($name, stringify!($name));
        };
    }
    
    impl_foo!(u32);
    
    
    fn main() {
        println!("Hello, world!");
    }
    

    Which renders as:

    Example from rustdoc