Quick Reference

  • /// Documents the item following the comment
  • //! Documents the parent item
  • #[doc(html_playground_url = "https://playground.example.com/")] to add a Run button to examples
  • #[doc(hidden)] to hide items
  • #[doc(alias = "alias")] to make items easier to find via the search index
  • [Bar], [bar](Bar), is supported for linking items (i.e. [String](std::string::String))
  • Markdown is supported including sections (#), footnotes ([^note]), tables, tasks, punctuation
  • Keep documentation lines to 100 characters
  • Codeblock attributes (```[attribute]) options: should_panic, no_run, compile_fail

Templates

These are templates and do not necessarily need to be followed exactly. The goal is to provide great, easy-to-read, and understandable documentation.

Crate Template

#![allow(unused)]
fn main() {
//! Summary Line -> what this is
//!
//! Longer description and use of the crate
//!
//! ## Getting Started
//!
//! <any non-code requirements for this library to work (installations, etc.)>
//!
//! ## Examples and Usage
//!
//! <Short examples of using this library or links to where examples can be found>
//! <can use links [`String`](std::string::String) to other places in the library>
//!
//! ## Features
//!
//! <Add this section if this library defines features that can be enabled / disabled>
//!
//! ## <Custom sections>
//!
//! <Common additional sections are described in the Common Sections section or other custom
//! sections>
//!
//! ## License
//!
//! <Add the license type here>
//!
}

Module Template

#![allow(unused)]
fn main() {
//! Summary Line -> what this is
//!
//! Longer description and use of the module.
//!
//! ## <Custom sections>
//!
//! <Common additional sections are described in the Common Sections section or other custom
//! sections>
//!
}

Type Template

#![allow(unused)]
fn main() {
/// Summary line -> what this is
///
/// <Optional> longer description and semantics regarding the type. (e.g. how to construct and deconstruct)
///
/// ## <Custom sections>
///
/// <Common additional sections are described in the Common Sections section or other custom
/// sections>
///
/// <for each attribute in the type>
/// A short description of the attribute
///
}

Function Template

#![allow(unused)]
fn main() {
/// Summary line -> what this is
///
/// <Optional> longer description of what is returned
///
/// ## Errors
///
/// <list of possible raised errors and why. Use doc links>
/// Returns [`NoOptionalHeader`](Pe32Error::NoOptionalHeader) if the optional header is missing
/// in the PE32 image.
///
/// ## Examples
///
/// ```
/// <some-rust-code></some-rust-code>
/// ```
///
/// <Common additional sections are described in the Common Sections section or other custom
/// sections>
///
}

Documentation Best Practices

---
config:
  layout: elk
  look: handDrawn
---
graph TD
    A[Documentation Best Practices] --> B[Be Consistent]
    A --> C[Use Active Voice]
    A --> D[Provide Examples]
    A --> E[Document Errors and Panics]
    A --> F[Link Related Items]
    B --> G[Follow Templates]
    C --> H[Improves Readability]
    D --> I[Shows Usage Patterns]
    E --> J[Ensures Safe Usage]
    F --> K[Creates Documentation Web]

General Guidelines

  • Be comprehensive: Document all public items, even if their function seems obvious
  • Use examples: Provide concrete examples for complex functions and types
  • Document safety: Always document unsafe functions with clear safety requirements
  • Cross-reference: Link to related items using [Item] syntax
  • Stay up-to-date: Update documentation when code changes
  • Consider the user: Write documentation from the user's perspective

Common Pitfalls to Avoid

  • Undocumented assumptions: Make requirements and preconditions explicit
  • Outdated examples: Ensure examples still compile and work as expected
  • Focusing on implementation: Focus on how to use the item, not how it works internally
  • Forgetting edge cases: Document unusual behaviors and error conditions