Rust文档生成工具库documented的使用,高效自动化生成代码文档与API参考

use documented::{Documented, DocumentedFields, DocumentedVariants};

/// Trying is the first step to failure.
#[derive(Documented, DocumentedFields, DocumentedVariants)]
enum AlwaysPlay {
    /// And Kb8.
    #[allow(dead_code)]
    Kb1,
    /// But only if you are white.
    F6,
}

// Documented
assert_eq!(AlwaysPlay::DOCS, "Trying is the first step to failure.");

// DocumentedFields
assert_eq!(
    AlwaysPlay::FIELD_DOCS,
    ["And Kb8.", "But only if you are white."]
);
assert_eq!(AlwaysPlay::get_field_docs("Kb1"), Ok("And Kb8."));

// DocumentedVariants
assert_eq!(
    AlwaysPlay::F6.get_variant_docs(),
    "But only if you are white."
);

完整示例代码:

// 引入documented宏
use documented::{Documented, DocumentedFields, DocumentedVariants};

/// 用户信息结构体
/// 这是一个表示用户基本信息的结构体
#[derive(Documented, DocumentedFields)]
struct User {
    /// 用户ID,唯一标识符
    id: u64,
    /// 用户名,用于登录和显示
    username: String,
    /// 用户邮箱地址
    email: String,
    /// 用户年龄
    age: u8,
    /// 用户是否激活
    is_active: bool,
}

/// 订单状态枚举
/// 表示订单的不同状态
#[derive(Documented, DocumentedVariants)]
enum OrderStatus {
    /// 订单已创建,等待支付
    Pending,
    /// 订单已支付,等待发货
    Paid,
    /// 订单已发货,运输中
    Shipped,
    /// 订单已送达,完成
    Delivered,
    /// 订单已取消
    Cancelled,
    /// 订单退款中
    Refunding,
    /// 订单已退款
    Refunded,
}

fn main() {
    // 访问结构体文档
    println!("User结构体文档: {}", User::DOCS);
    
    // 访问结构体字段文档
    println!("所有字段文档: {:?}", User::FIELD_DOCS);
    println!("username字段文档: {:?}", User::get_field_docs("username"));
    println!("email字段文档: {:?}", User::get_field_docs("email"));
    
    // 访问枚举文档
    println!("OrderStatus枚举文档: {}", OrderStatus::DOCS);
    
    // 访问枚举变体文档
    let status = OrderStatus::Shipped;
    println!("Shipped变体文档: {}", status.get_variant_docs());
    
    // 获取所有变体文档
    println!("Pending变体文档: {}", OrderStatus::Pending.get_variant_docs());
    println!("Paid变体文档: {}", OrderStatus::Paid.get_variant_docs());
    
    // 示例:在运行时动态显示文档
    let user_fields = ["id", "username", "email", "age", "is_active"];
    for field in user_fields.iter() {
        if let Ok(docs) = User::get_field_docs(field) {
            println!("字段 {} 的文档: {}", field, docs);
        }
    }
    
    // 示例:处理订单状态时的文档显示
    let order_statuses = [
        OrderStatus::Pending,
        OrderStatus::Paid, 
        OrderStatus::Shipped,
        OrderStatus::Delivered,
    ];
    
    for status in order_statuses.iter() {
        println!("状态 {:?}: {}", status, status.get_variant_docs());
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[test]
    fn test_user_docs() {
        assert_eq!(User::DOCS, "用户信息结构体\n这是一个表示用户基本信息的结构体");
        assert_eq!(User::get_field_docs("username"), Ok("用户名,用于登录和显示"));
        assert_eq!(User::get_field_docs("email"), Ok("用户邮箱地址"));
    }
    
    #[test]
    fn test_order_status_docs() {
        assert_eq!(OrderStatus::DOCS, "订单状态枚举\n表示订单的不同状态");
        assert_eq!(OrderStatus::Pending.get_variant_docs(), "订单已创建,等待支付");
        assert_eq!(OrderStatus::Shipped.get_variant_docs(), "订单已发货,运输中");
    }
}

Cargo.toml 配置:

[package]
name = "documented-demo"
version = "0.1.0"
edition = "2021"

[dependencies]
documented = "0.9.2"

这个示例展示了如何使用documented库来自动化生成和访问代码文档。通过派生Documented、DocumentedFields和DocumentedVariants宏,可以在运行时获取类型、字段和枚举变体的文档字符串,从而实现动态的文档显示和API参考功能。


1 回复

Rust文档生成工具库documented的使用指南

概述

documented是一个专为Rust项目设计的文档生成工具库,能够帮助开发者高效自动化地生成代码文档和API参考。该工具与Rust内置的rustdoc工具深度集成,提供了更丰富的自定义选项和自动化功能。

核心特性

  • 自动化文档生成
  • 支持Markdown格式
  • 自定义文档模板
  • API参考自动生成
  • 代码示例验证
  • 多格式输出支持(HTML、PDF等)

安装方法

在Cargo.toml中添加依赖:

[dependencies]
documented = "0.4.2"

或者使用cargo命令安装:

cargo add documented

基本使用方法

1. 基础配置

创建doc.toml配置文件:

[package]
name = "my-project"
version = "0.1.0"

[output]
format = "html"
directory = "./docs"

2. 生成文档

在项目根目录运行:

cargo documented

或者使用自定义配置:

cargo documented --config path/to/config.toml

3. 代码注释示例

/// 计算两个数字的和
///
/// # 示例
///
/// ```
/// use my_crate::add;
///
/// let result = add(2, 3);
/// assert_eq!(result, 5);
/// ```
///
/// # 参数
/// - `a`: 第一个加数
/// - `b`: 第二个加数
///
/// # 返回值
/// 返回两个参数的和
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

高级功能

自定义模板

[template]
path = "./custom_template"
variables = { project_name = "My Awesome Project" }

多模块支持

//! 主模块文档
//!
//! 这里可以写详细的模块说明

mod utils {
    //! 工具模块
    //!
    //! 包含各种实用函数
    
    /// 工具函数示例
    pub fn helper_function() {
        // 函数实现
    }
}

生成API参考

cargo documented --api-reference

配置选项详解

[output]
format = "html"        # 输出格式:html, markdown, pdf
directory = "./docs"   # 输出目录
theme = "dark"         # 主题选项

[processing]
include_private = false    # 是否包含私有项
warnings_as_errors = true  # 警告视为错误

[metadata]
authors = ["作者1", "作者2"]
repository = "https://github.com/username/repo"

集成到CI/CD

在.github/workflows/docs.yml中添加:

name: Generate Documentation

on:
  push:
    branches: [ main ]

jobs:
  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Generate docs
        run: |
          cargo install documented
          cargo documented

最佳实践

  1. 为所有公共API添加详细的文档注释
  2. 包含代码示例并确保示例能够编译通过
  3. 定期运行文档生成以确保文档与代码同步
  4. 使用版本控制管理文档变更

故障排除

常见问题:

  • 确保所有依赖项都已正确安装
  • 检查配置文件格式是否正确
  • 验证代码注释是否符合Rustdoc标准

通过合理使用documented库,可以显著提升Rust项目的文档质量,为团队协作和项目维护提供有力支持。

完整示例demo

以下是一个完整的Rust项目示例,展示如何使用documented库:

Cargo.toml

[package]
name = "math-utils"
version = "0.1.0"
edition = "2021"

[dependencies]
documented = "0.4.2"

src/lib.rs

//! 数学工具库
//!
//! 提供基本的数学运算函数

/// 计算两个数字的和
///
/// # 示例
///
/// ```
/// use math_utils::add;
///
/// let result = add(2, 3);
/// assert_eq!(result, 5);
/// ```
///
/// # 参数
/// - `a`: 第一个加数
/// - `b`: 第二个加数
///
/// # 返回值
/// 返回两个参数的和
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

/// 计算两个数字的差
///
/// # 示例
///
/// ```
/// use math_utils::subtract;
///
/// let result = subtract(5, 3);
/// assert_eq!(result, 2);
/// ```
///
/// # 参数
/// - `a`: 被减数
/// - `b`: 减数
///
/// # 返回值
/// 返回两个参数的差
pub fn subtract(a: i32, b: i32) -> i32 {
    a - b
}

/// 工具模块
pub mod utils {
    //! 实用工具函数
    
    /// 检查数字是否为偶数
    ///
    /// # 示例
    ///
    /// ```
    /// use math_utils::utils::is_even;
    ///
    /// assert!(is_even(4));
    /// assert!(!is_even(5));
    /// ```
    pub fn is_even(num: i32) -> bool {
        num % 2 == 0
    }
}

doc.toml

[package]
name = "math-utils"
version = "0.1.0"

[output]
format = "html"
directory = "./target/docs"
theme = "dark"

[processing]
include_private = false
warnings_as_errors = true

[metadata]
authors = ["开发者"]
description = "一个简单的数学工具库"

生成文档的命令

# 安装documented(如果尚未安装)
cargo install documented

# 生成文档
cargo documented

# 或者使用自定义配置文件
cargo documented --config doc.toml

# 生成包含API参考的文档
cargo documented --api-reference

GitHub Actions配置 (.github/workflows/docs.yml)

name: Generate Documentation

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Rust
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          override: true
      - name: Generate documentation
        run: |
          cargo install documented
          cargo documented
      - name: Deploy to GitHub Pages
        if: github.ref == 'refs/heads/main'
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./target/docs

这个完整示例展示了如何使用documented库来为一个数学工具库生成完整的文档,包括基本的配置、代码注释规范、以及CI/CD集成。

回到顶部