rust_pattern_macros/lib.rs
1use proc_macro::TokenStream;
2
3mod observable;
4mod simple_factory;
5
6/// 为 trait 生成简单工厂实现的属性宏。
7///
8/// 此宏应用于 trait 定义,会自动生成一个对应的工厂结构体。
9/// 生成的工厂结构体名为 `{TraitName}Factory`,并提供一个 `create` 方法,
10/// 该方法使用全局静态工厂来创建 trait 对象的实例。
11///
12/// 注意:此宏生成的代码依赖于 `rust_patterns` crate,请确保在项目中添加该依赖。
13///
14/// # 使用方法
15///
16/// ```rust,ignore
17/// use pattern_macros::simple_factory;
18///
19/// #[simple_factory]
20/// pub trait MyTrait {
21/// fn do_something(&self);
22/// }
23/// ```
24///
25/// 也可以指定额外的 trait bound:
26///
27/// ```rust,ignore
28/// use pattern_macros::simple_factory;
29///
30/// #[simple_factory(Send + Sync)]
31/// pub trait MyTrait {
32/// fn do_something(&self);
33/// }
34/// ```
35///
36/// # 生成的内容
37///
38/// 宏会生成以下内容:
39/// 1. 原始的 trait 定义
40/// 2. 工厂结构体 `{TraitName}Factory`
41/// 3. 工厂的 `create` 方法实现
42///
43/// `create` 方法签名:
44/// ```rust,ignore
45/// pub fn create(
46/// id: &str,
47/// strategy: rust_patterns::FactoryFallback,
48/// ) -> Result<(&str, Box<dyn MyTrait>), rust_patterns::FactoryError>
49/// ```
50#[proc_macro_attribute]
51pub fn simple_factory(args: TokenStream, input: TokenStream) -> TokenStream {
52 simple_factory::generate(args, input)
53}
54
55/// 为结构体自动实现 `Observable` trait 的属性宏。
56///
57/// 此宏应用于结构体定义,会自动:
58/// 1. 添加 `registry: ObserverRegistry<Self>` 字段
59/// 2. 实现 `Observable` trait,包括 `State` 和 `Error` 关联类型
60/// 3. 提供 `attach` 和 `detach` 方法的默认实现
61///
62/// # 使用方法
63///
64/// ```rust,ignore
65/// use pattern_macros::observable;
66///
67/// #[observable(state = u64, error = anyhow::Error)]
68/// struct TemperatureSensor {
69/// temperature: f64,
70/// }
71/// ```
72///
73/// 也可以使用自定义的错误类型:
74///
75/// ```rust,ignore
76/// #[observable(state = String, error = std::io::Error)]
77/// struct Logger {
78/// log_level: u8,
79/// }
80/// ```
81///
82/// # 生成的内容
83///
84/// 宏会生成以下内容:
85/// 1. 添加 `registry: ObserverRegistry<Self>` 字段到结构体
86/// 2. 实现 `Observable` trait,设置 `State` 和 `Error` 关联类型
87/// 3. 实现 `attach` 和 `detach` 方法,委托给内部的 `registry`
88#[proc_macro_attribute]
89pub fn observable(args: TokenStream, input: TokenStream) -> TokenStream {
90 observable::generate(args, input)
91}