16 个版本

0.5.1 2022 年 9 月 9 日
0.5.0 2021 年 11 月 4 日
0.4.2 2021 年 3 月 3 日
0.3.0 2020 年 9 月 3 日
0.1.1 2020 年 4 月 30 日

#2030Rust 模式

Download history 6022/week @ 2024-03-15 6977/week @ 2024-03-22 5889/week @ 2024-03-29 5686/week @ 2024-04-05 7597/week @ 2024-04-12 7604/week @ 2024-04-19 6209/week @ 2024-04-26 6152/week @ 2024-05-03 6296/week @ 2024-05-10 6372/week @ 2024-05-17 6139/week @ 2024-05-24 6215/week @ 2024-05-31 7677/week @ 2024-06-07 8394/week @ 2024-06-14 8824/week @ 2024-06-21 6272/week @ 2024-06-28

32,383 每月下载量
19 包中使用 (直接使用 8 个)

Apache-2.0

27KB
488

Cargo

Rust 的基于意见和选项的构建器模式宏

动机

用于支持 Rust 构建器模式的 derive 宏

  • 除了需要 Option<> 字段和显式定义的 default 属性之外,一切都需要,因此不需要任何额外的属性来指示它,并且所需的参数的存在会在编译时(而不是在运行时)进行检查。
  • 要创建新的结构体实例,可以使用 ::new 和一个仅包含所需字段的辅助初始化结构体定义(以补偿 Rust 命名参数无法使用的问题)。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
rsb_derive = "0.4"

该宏为您的结构体生成以下函数和实例

  • with/without/opt_<field_name> : 字段的不可变设置器(opt 是用于 Option<> 输入参数的附加设置器)
  • <field_name>/reset/mopt_<field_name> : 字段的可变设置器(mopt 是用于 Option<> 输入参数的附加设置器)
  • new : 带有必需字段参数的工厂方法
  • <>一个只包含必需字段的辅助初始化结构定义实例。生成的初始化结构为<您的结构名称>Init。因此,您可以从中使用from(...)into()函数。

在您的结构上标记derive属性

// Import it
use rsb_derive::Builder;

// And use it on your structs
#[derive(Clone,Builder)]
struct MyStructure {
    pub req_field1: String,
    pub req_field2: i32,
    pub opt_field1: Option<String>,
    pub opt_field2: Option<i32>
}

在您的结构上使用builder模式

// Creating instances

// Option #1:
let s1 : MyStructure = MyStructure::new(
            "hey".into(),
            0);

// Option #2 (named arguments emulation):
let s2 : MyStructure = MyStructureInit {
        req_field1 : "hey".into(),
        req_field2 : 0
    }.into();


// Working with instances
let updated = 
    s1.clone()
      .with_opt_field1("hey".into()) // for Option<> fields you specify a bare argument
      .without_opt_field2() // you can reset Option<> if you need it
      .opt_opt_field1(Some(("hey".into())) // you can use opt_<field> to provide Option<> inputs
      .with_req_field2(10); // you can update required params as well

// All together example

let s1 : MyStructure =
    MyStructure::from(
        MyStructureInit {
            req_field1 : "hey".into(),
            req_field2 : 0
        }
    )
        .with_opt_field1("hey".into())
        .with_opt_field2(10);

// Mutable example (in case you really need it)
let mut s1 : MyStructure =
    MyStructure::from(
        MyStructureInit {
            req_field1 : "hey".into(),
            req_field2 : 0
        }
    );

s1
    .opt_field1("hey".into()) // no prefix with for mutable setter    
    .opt_field2(10)
    .field2(15)
    .reset_opt_field2(); // mutable reset function for optional fields

    


默认值

虽然您可以在自己的结构或辅助初始化结构上使用Rust的Default,但这个库故意忽略这种方法,并为您提供了一个辅助的default属性来管理它,例如

#[derive(Debug, Clone, PartialEq, Builder)]
struct StructWithDefault {
    pub req_field1: String,
    #[default="10"]
    pub req_field2: i32, // default here make this field behave like optional

    pub opt_field1: Option<String>,
    #[default="Some(11)"]
    pub opt_field2: Option<i32> // default works also on optional fields
}

let my_struct : StructWithDefault = StructWithDefault::from(
    StructWithDefaultInit {
        req_field1 : "test".into()
    }
);

许可证

Apache软件许可证(ASL)

作者

Abdulla Abdurakhmanov

依赖关系

~1.5MB
~35K SLoC