3 个版本

0.3.3 2023年2月7日
0.3.2 2023年2月2日
0.2.7 2023年1月31日
0.1.2 2023年1月24日

#2395Rust 模式

36 每月下载量

MIT 许可证

12KB
97

Aggregate

使用简单的 Derive 宏无分配地访问结构体、枚举、联合及其字段的属性。

关于

Aggregate 利用宏、完美哈希函数和懒加载的强大功能,以实现极致的性能。

Amalgamate 是表示结构体/枚举/联合的属性结构的单例,位于共享静态内存中,可以通过类型函数调用进行访问。

Aggregate 通过在嵌套结构上调用 aggregate() 进行递归工作,不限制可使用的类型,并通过引用链接嵌套 Amalgamate 来避免运行时开销。

属性保持完整,这意味着在访问时,它们被表示为 syn::Attribute。然而,从标记解析 所有 属性可能会非常昂贵且浪费,这就是为什么它们是懒加载的,并且仅在访问时解析。

特性

默认情况下,所有特性都启用。

  • derive 重新导出 aggregate_derive

  • impl 为如 Option<T> 这样的常用类型添加默认实现。

  • fmtAmalgamate 实现 fmt::Debug

用法

aggregate 非常简单易用。

为了聚合你的结构体/枚举/联合的属性,只需对其进行派生

// The prelude is not required for derive,
// however in order to use `aggregate`,
// the trait must be in scope
use aggregate::prelude::*;

/// This attribute is paired with the type
#[derive(Aggregate)]
struct Config {
  /// This attribute is paired with the field
  switch: bool,
}

Aggregate 支持嵌套

/// This attribute is paired with the type.
#[derive(Aggregate)]
struct ConfigFile {
  /// This attribute is paired with the field
  ///
  /// This field has an `inner`, which will 
  /// include the aggregation of `Config`
  ///
  /// In order for `aggregate_derive` to notice 
  /// nested structures, you must mark the field 
  /// with the `#[aggregate]` attribute:
  #[aggregate]
  my_config: Config,
}

在枚举变体上不需要 #[aggregate] 属性,但在枚举变体结构体和元组内部需要。

#[derive(Aggregate)]
enum MyEnum {
  /// Variants are automatically included
  VariantOne {
    /// Fields must be marked
    #[aggregate]
    field_1: Inner,
  },

  /// Unnamed structs like this are also 
  /// supported; `aggregate` simply enumerates 
  /// the fields for representation
  VariantTwo(#[aggregate] Inner),
}

依赖

~2MB
~44K SLoC