#struct-fields #macro-derive #struct #partial #field #optional

no-std 部分

提供 Partial 特性,以及一个可选宏,用于镜像一个结构体,将每个字段包装在 Option 中。

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次下载

MIT/Apache

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