14 个版本

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

#aggregate 中排名第 50

每月下载量 25
aggregate 中使用

MIT 许可证

17KB
251 行(不含注释)

Aggregate

使用简单的 Derive 宏,在不分配资源的情况下访问结构体、枚举、联合及其字段的属性。

关于

Aggregate 利用宏、完美哈希函数和懒加载来提供极致性能。

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

Aggregate 通过递归调用 aggregate() 来工作,它可以在嵌套结构中调用,而不限制可用的类型,并且通过简单地通过引用链接嵌套的 Amalgamate 来避免运行时开销。

属性保持完整,这意味着在访问时,它们表示为 syn::Attribute。然而,从标记中解析所有属性可能代价高昂且浪费,这就是为什么它们是懒加载的,并且只有在访问时才进行解析。

功能

默认情况下,所有功能都启用。

  • derive 重新导出 aggregate_derive

  • impl 为常见类型如 Option<T> 添加默认实现。

  • fmtAmalgamate 实现 fmt::Debug

用法

aggregate 的使用非常简单。

为了聚合结构体/枚举/联合的属性,只需进行 derive

// 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