4 个版本
0.2.1 | 2024年1月20日 |
---|---|
0.2.0 | 2023年11月4日 |
0.1.1 | 2023年10月31日 |
0.1.0 | 2023年9月17日 |
#926 in Rust 模式
每月41次下载
14KB
部分
提供可配置的 derive 宏,它生成具有相同字段但包装在
Option<T>
中的另一个结构体,并实现Partial
以允许有条件地将生成的结构体字段应用于基础结构体字段。
partially
提供 Partial
特性,允许将另一个结构体的值应用于 self
,目的是另一个结构体反映了 self
的字段,但包装在 Option<T>
中。
此外,partially_derive
(或启用 derive
功能的 partially
)支持自动生成一个镜像结构体,每个字段都包装在 Option<T>
中,并生成一个 Partial
实现以允许将镜像结构体的 Some
字段应用于基础结构体。我预计大多数人会对使用 derive 宏感兴趣。
用法
使用 derive
// `partially` installed with feature `derive`
use partially::Partial;
// define a base structure, with the `Partial` derive macro
#[derive(Partial)]
// further, instruct the macro to derive `Default` on the generated structure
#[partially(derive(Default))]
struct Data {
// since no field options are specified, this field will be mapped
// to an `Option<String>` in the generated structure
value: String,
}
// example usage
fn main() {
// since we derived default for the generated struct, we can use that
// to obtain a partial struct filled with `None`.
let empty_partial = PartialData::default();
// we can, of course, also specify values ourself
let full_partial = PartialData {
value: Some("modified".to_string()),
};
// define a "base" that we'll operate against
let mut full = Data {
value: "initial".to_string(),
};
// apply the empty partial (note that `false` is returned, indicating nothing was applied)
assert!(!full.apply_some(empty_partial));
// note that applying the empty partial had no effect
assert_eq!(full.value, "initial".to_string());
// apply the full partial (note that `true` is returned, indicating something was applied)
assert!(full.apply_some(full_partial));
// note that applying the full partial modified the value
assert_eq!(full.value, "modified".to_string());
}
不使用 derive
use partially::Partial;
struct Base {
value: String,
}
#[derive(Default)]
struct PartialBase {
value: Option<String>,
}
impl Partial for Base {
type Item = PartialBase;
#[allow(clippy::useless_conversion)]
fn apply_some(&mut self, partial: Self::Item) -> bool {
let will_apply_some = partial.value.is_some();
if let Some(value) = partial.value {
self.value = value.into();
}
will_apply_some
}
}
fn main() {
let empty_partial = PartialBase::default();
let full_partial = PartialBase {
value: Some("modified".to_string()),
};
let mut data = Base {
value: "initial".to_string(),
};
assert!(!data.apply_some(empty_partial));
assert_eq!(data.value, "initial".to_string());
assert!(data.apply_some(full_partial));
assert_eq!(data.value, "modified".to_string())
}
结构体选项
derive
使用示例:
#[partially(derive(Debug, Default))]
。
指示宏在生成的结构体上生成一个 #[derive(...)]
属性。
注意:当使用此选项与 skip_attributes
选项一起使用时,derive 属性 仍然会被添加到生成的结构体中。
重命名
使用示例:
#[partially(rename = "MyGeneratedStruct")]
。
指示宏使用给定的标识符来为生成的结构体命名。默认情况下,使用 PartialBaseStructName
,其中 BaseStructName
是原始结构体的名称。
属性
使用示例:
#[partially(attribute(serde(rename_all = "PascalCase")))]
指示宏向生成的结构体添加额外的属性。默认情况下,基础结构体上定义的属性将传递到生成的结构体中,除非存在 skip_attributes
选项。
skip_attributes
使用示例:
#[partially(skip_attributes)]
。
指示宏跳过从原始结构体向生成结构体传递属性。默认情况下,基础结构体上存在的所有属性都将添加到生成的结构体中。
注意:当与 derive
选项一起使用时,仍然会将 derive 属性添加到生成的结构体中。
注意:当与 attribute
选项一起使用时,指定的属性仍将添加到生成的结构体中。
crate
使用示例:
#[partially(crate = "my_partially_crate")]
。
指示宏使用不同的基础路径来为 Partial
特性实现。默认情况下,使用 partially
。如果你已经分叉了 partially
crate,这可能很有用。
字段选项
重命名
使用示例:
#[partially(rename = "new_field_name")]
。
指示宏使用给定的标识符来为生成的字段命名。默认情况下,使用与基础结构体相同的名称。
omit
使用示例:
#[partially(omit)]
。
指示宏从生成的结构体中省略该字段。默认情况下,不省略任何字段。
transparent
使用示例:
#[partially(transparent)]
。
指示宏跳过在生成的字段周围包裹Option<T>
,而是将字段类型透明地映射到生成的结构体中。
as_type
使用示例:
#[partially(as_type = "Option<f32>")]
。
指示宏在生成字段时使用提供的类型而不是Option<T>
。注意,提供的类型将被直接使用,因此如果您期望一个Option<T>
值,您需要手动指定。
注意:当使用as_type
时,给定的类型必须满足Into<BaseType>
条件,其中BaseType
是原始字段类型。这是实现Partial
特质的必要条件。
依赖项
~160KB