rust-patterns 0.1.0

A modern Rust design patterns library with type-safe, efficient implementations
Documentation
/// 为构建器模式提供辅助方法的宏。
///
/// 此宏为指定的构建器类型添加一个 `when_some` 方法,允许条件性地设置可选值。
/// 当 `Option<T>` 为 `Some` 时,会调用提供的函数来设置值;当为 `None` 时,直接返回构建器本身。
///
/// # 用法
///
/// 有两种调用方式:
/// 1. 为 `Self` 类型实现:
///    ```rust
///    use rust_patterns::builder_helper;
///
///    struct MyBuilder1;
///    struct MyBuilder2;
///
///    builder_helper!(Self, MyBuilder1, MyBuilder2);
///
///    // 现在 MyBuilder1 和 MyBuilder2 都有 when_some 方法
///    ```
/// 2. 为 `&mut Self` 类型实现:
///    ```rust
///    use rust_patterns::builder_helper;
///
///    struct MyBuilder1;
///    struct MyBuilder2;
///
///    builder_helper!(&mut Self, MyBuilder1, MyBuilder2);
///
///    // 现在 MyBuilder1 和 MyBuilder2 都有 when_some 方法
///    ```
///
/// # 生成的方法
///
/// 宏会为每个指定的构建器类型生成一个 `when_some` 方法:
/// ```rust
/// # use rust_patterns::builder_helper;
/// # struct MyBuilder;
/// # builder_helper!(Self, MyBuilder);
/// # impl MyBuilder {
/// fn when_some<T>(self, value: Option<T>, func: impl FnOnce(Self, T) -> Self) -> Self
/// where
///     Self: Sized;
/// # }
/// ```
///
/// 或者对于 `&mut Self` 版本:
/// ```rust
/// # use rust_patterns::builder_helper;
/// # struct MyBuilder;
/// # builder_helper!(&mut Self, MyBuilder);
/// # impl MyBuilder {
/// fn when_some<T>(&mut self, value: Option<T>, func: impl FnOnce(&mut Self, T) -> &mut Self) -> &mut Self
/// where
///     Self: Sized;
/// # }
/// ```
#[macro_export]
macro_rules! builder_helper {
    (@ { $self:ty, $($builder:ty),+ }) => {
        /// 构建器辅助 trait,提供条件性设置值的方法。
        trait Builder {
            #[inline]
            fn when_some<T>(self: $self, value: Option<T>, func: impl FnOnce($self, T) -> $self) -> $self
            where
                Self: Sized,
            {
                match value {
                    Some(v) => func(self, v),
                    None => self,
                }
            }
        }

        $(impl Builder for $builder {})+
    };

    (Self, $($builder:ty),+ $(,)?) => {
        $crate::builder_helper!(@ {Self, $($builder),+});
    };

    (&mut Self, $($builder:ty),+ $(,)?) => {
        $crate::builder_helper!(@ {&mut Self, $($builder),+});
    };
}