29 March 2023
Rust and Cargo have excellent support for interface documentation.
For simple comments in the code, you can use the //
and /* … */
syntax you may know from C, Java, and other languages:
// this is a comment
/* another comment with a /* nested comment */ inside */
Unlike in C and Go, you can have a /* … */
comment inside another one.
For interface documentation, put a comment starting with ///
just before the item you
want to document, or a comment starting with //!
inside the item. Usually
//!
is used to document modules, putting the comment at the top of the file, and
///
for everything else:
//! Comment describing the crate.
/// Documentation for foo.
pub fn foo() -> bool { true }
// Documentation for Bar.
pub struct Bar {
/// Documentation for a.
pub a: i32,
/// Documentation for b.
pub b: f64,
}
The cargo doc
command uses these to build nicely formatted HTML documentation. If you
run
cargo doc --open
it’ll build the documentation and open it in your default browser. This doesn’t start a server -- it
just builds the documentation in the target
directory, so you’ll have to run
cargo doc
again after you make changes.
Documentation is written in Markdown so you can use headings, lists, etc. Markdown code blocks are meant to have executable code samples:
/// Returns `x` added to itself.
///
/// ```
/// let y = mycrate::double(2);
/// assert_eq!(y, 4);
/// ```
pub fn double(x: i32) -> i32 {
x + x
}
The code will be shown, with syntax highlighting, in the generated documentation, but it’s also a type of test (see Rust: Testing) which you can run with
cargo test --doc
One final detail: when you re-export definitions with pub use
, by default the
re-exported items will be documented in-line with the rest of the module. You can turn that off with
an annotation:
#[doc(no_inline)]
pub use nested::{x, y};
With no_inline
, the documentation for this module won’t include the documentation for
x
and y but it will have a section titled “Re-exports” that lists the
items that are re-exported. If you don’t want any mention of the re-exported items, use
hidden
:
#[doc(hidden)]
pub use nested::{x, y};