Expand description
The point of this (small) crate is to allow you to add doc comments from macros or
to test external markdown files’ code blocks through rustdoc.
Starting in Rust 1.54, this crate becomes useless as you can do the same thing
with the doc attribute:
#[cfg_attr(doctest, doc = include_str!("../README.md"))]§Including file(s) for testing
Let’s assume you want to test code examples in your README.md file which
looks like this:
# A crate
Here is a code example:
```rust
let x = 2;
assert!(x != 0);
```You can use the doc_comment! macro to test it like this:
#[macro_use]
extern crate doc_comment;
// When running `cargo test`, rustdoc will check this file as well.
doc_comment!(include_str!("../README.md"));Please note that can also use the doctest! macro to have a shorter way to test an outer
file:
#[macro_use]
extern crate doc_comment;
doctest!("../README.md");Please also note that you can use #[cfg(doctest)]:
#[cfg(doctest)]
doctest!("../README.md");In this case, the examples in the README.md file will only be run on cargo test. You
can find more information about #[cfg(doctest)] in this blogpost.
§Generic documentation
Now let’s imagine you want to write documentation once for multiple types but still having examples specific to each type:
// The macro which generates types
macro_rules! gen_types {
($tyname:ident) => {
/// This is a wonderful generated struct!
///
/// You can use it as follow:
///
/// ```
/// let x = FirstOne {
/// field1: 0,
/// field2: 0,
/// field3: 0,
/// field4: 0,
/// };
///
/// println!("Created a new instance of FirstOne: {:?}", x);
/// ```
#[derive(Debug)]
pub struct $tyname {
pub field1: u8,
pub field2: u16,
pub field3: u32,
pub field4: u64,
}
}
}
// Now let's actually generate types:
gen_types!(FirstOne);
gen_types!(SecondOne);
gen_types!(Another);So now we have created three structs with different names, but they all have the exact same
documentation, which is an issue for any structs not called FirstOne. That’s where
doc_comment! macro comes in handy!
Let’s rewrite the gen_types! macro:
// Of course, we need to import the `doc_comment` macro:
#[macro_use]
extern crate doc_comment;
macro_rules! gen_types {
($tyname:ident) => {
doc_comment! {
concat!("This is a wonderful generated struct!
You can use it as follow:
```
let x = ", stringify!($tyname), " {
field1: 0,
field2: 0,
field3: 0,
field4: 0,
};
println!(\"Created a new instance of ", stringify!($tyname), ": {:?}\", x);
```"),
#[derive(Debug)]
pub struct $tyname {
pub field1: u8,
pub field2: u16,
pub field3: u32,
pub field4: u64,
}
}
}
}
gen_types!(FirstOne);
gen_types!(SecondOne);
gen_types!(Another);Now each struct has doc which match itself!
Macros§
- doc_
comment - This macro can be used to generate documentation upon a type/item (or just to test outer markdown file code examples).
- doctest
- This macro provides a simpler way to test an outer markdown file.