rust-pattern-macros 0.1.2

Procedural macros for the rust-patterns crate
Documentation

Rust Pattern Macros

Crates.io Documentation License: MIT Build Status

Crates.io Documentation License: MIT Build Status

rust-pattern-macrosrust-patterns 库的过程宏扩展,提供了属性宏来简化 Rust 中设计模式的实现。

特性

  • 零成本抽象:生成的代码经过优化,几乎没有运行时开销
  • 线程安全:所有生成的代码都是线程安全的
  • 易于使用:简洁的 API 设计,提供丰富的文档和示例
  • 生产就绪:经过充分测试,包含单元测试和文档测试

安装

Cargo.toml 中添加:

[dependencies]

rust-patterns = "0.1.1"

rust-pattern-macros = "0.1.2"

包含的宏

1. #[simple_factory] - 简单工厂模式

为 trait 生成简单工厂实现,自动创建工厂结构体和创建方法。

基本用法

use rust_pattern_macros::simple_factory;

#[simple_factory]
pub trait Product {
    fn name(&self) -> &str;
    fn price(&self) -> f64;
}

// 宏会生成 ProductFactory 结构体
// 可以使用 ProductFactory::create() 方法创建产品

带 trait bound 的用法

#[simple_factory(Send + Sync)]
pub trait Service {
    fn execute(&self) -> Result<String, String>;
}

// 生成的工厂会确保创建的对象满足 Send + Sync 约束

生成的代码

宏会生成以下内容:

  1. 原始的 trait 定义
  2. 工厂结构体 {TraitName}Factory
  3. create 方法实现,使用全局静态工厂实例

create 方法签名:

pub fn create(
    id: &str,
    strategy: rust_patterns::FactoryFallback,
) -> Result<(&str, Box<dyn Trait>), rust_patterns::FactoryError>

2. #[observable] - 观察者模式

为结构体自动实现 Observable trait,添加观察者管理功能。

基本用法

use rust_pattern_macros::observable;

#[observable(state = u64, error = String)]
struct Counter {
    value: u64,
}

// 手动初始化(需要提供 registry 字段)
let mut counter = Counter {
    value: 0,
    registry: rust_patterns::ObserverRegistry::new(),
};

// 现在可以使用 attach、detach、notify 等方法

自定义错误类型

#[derive(Debug)]
enum SensorError {
    InvalidReading,
    CommunicationFailed,
}

impl std::fmt::Display for SensorError { /* ... */ }
impl std::error::Error for SensorError { /* ... */ }

#[observable(state = f64, error = SensorError)]
struct TemperatureSensor {
    temperature: f64,
}

生成的代码

宏会为结构体生成:

  1. 添加 registry: ObserverRegistry<Self> 字段
  2. 实现 Observable trait,设置 StateError 关联类型
  3. 实现 attachdetach 方法
  4. 提供两个通知方法:
    • notify(&self, state: &State) - 使用 StopOnError 策略
    • notify_ignore_error(&self, state: &State) - 使用 IgnoreError 策略

设计特点

  • registry 字段使用结构体的可见性
  • 不提供 Default 实现,结构体初始化由用户负责
  • 只支持具名字段的结构体

示例

查看 examples/ 目录获取完整的使用示例:

# 运行 observable 示例

cargo run --example observable_example


# 运行 simple_factory 示例

cargo run --example simple_factory_example

API 文档

完整的 API 文档可在 docs.rs 查看。

运行测试

# 运行所有测试

cargo test


# 运行文档测试

cargo test --doc


# 运行特定宏的测试

cargo test --test observable_test

cargo test --test simple_factory_test

系统要求

  • Rust 1.70 或更高版本(需要 std::sync::LazyLock
  • rust-patterns crate 必须在你的项目中可用

贡献指南

欢迎贡献!请遵循以下步骤:

  1. Fork 项目
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 打开 Pull Request

许可证

本项目基于 MIT 许可证 - 查看 LICENSE 文件了解详情。

作者

致谢

  • 感谢所有贡献者和用户
  • 灵感来源于经典的设计模式书籍和 Rust 社区的最佳实践

版本信息

查看 crates.io 获取最新版本,或访问 GitHub Releases 查看版本历史。

相关项目


提示: 本项目正在积极开发中,API 可能会发生变化。建议在生产环境中使用时锁定特定版本。