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日

#1476过程宏

每月 30 次下载
用于 2 crate

MIT 许可证

7KB
59

聚合

使用简单的 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
约43K SLoC