#options #field #serde #trinary

optional-field

表示具有三种状态(存在、缺失或null)的值的替代数据类型,用于Option

6个版本

0.1.6 2023年7月27日
0.1.5 2023年6月22日
0.1.4 2023年5月17日
0.1.3 2022年10月1日
0.1.2 2021年7月7日

#318 in 编码

Download history 285/week @ 2024-03-13 266/week @ 2024-03-20 242/week @ 2024-03-27 278/week @ 2024-04-03 402/week @ 2024-04-10 828/week @ 2024-04-17 759/week @ 2024-04-24 287/week @ 2024-05-01 263/week @ 2024-05-08 283/week @ 2024-05-15 315/week @ 2024-05-22 326/week @ 2024-05-29 424/week @ 2024-06-05 297/week @ 2024-06-12 333/week @ 2024-06-19 312/week @ 2024-06-26

每月下载量 1,413
2 个crate中使用(通过fractal-storage-client

MIT 许可证

35KB
374

Optional Field

想用Rust谋生?CV Partner正在伦敦、奥斯陆、哥本哈根和斯德哥尔摩招聘Rust开发者。 查看职业页面

为可以表示为三种状态(缺失、存在但为null和存在有值)的值提供Rust类型和序列化/反序列化实现。

pub enum Field<T> {
    Missing,
    Present(Option<T>),
}

当使用JSON或其他格式,且serde默认将缺失键和null值视为相同,反序列化为Option::None时,这可能很有用。在序列化时也存在类似问题,您必须创建自己的三态枚举,并使用skip_serializing_if在每个字段上标记,以便不序列化该字段。

当API提供部分对象或差异时,这可能会带来问题,您不知道是否需要将值设置为null,或者应该保持值不变。

通过使用Field,您可以区分null值和缺失键,并使serde在这些情况下表现正确。

use serde::{Deserialize, Serialize};
use serde_json::json;
use optional_field::{Field, serde_optional_fields};

#[serde_optional_fields]
#[derive(Debug, Serialize, Deserialize)]
struct Thing {
    one: Field<u8>,
    two: Field<u8>,
    three: Field<u8>,
}

fn main() {
    let thing = serde_json::from_value::<Thing>(json!(
        {
            "one": 1,
            "two": null,
        }
    ))
    .unwrap();

    assert_eq!(Field::Present(Some(1)), thing.one);
    assert_eq!(Field::Present(None), thing.two);
    assert_eq!(Field::Missing, thing.three);
}

用法

字段实现了许多您熟悉的Option方法,例如mapunwrapas_ref等。Field将为这些方法返回Option内的值,同时也提供了一组等价的方法来访问Option本身。这些等价方法遵循在方法名中添加_present的模式。例如,给定Present(Some(100))unwrap()将返回100,而unwrap_present()将返回Some(100)

use optional_field::Field;

struct Thing {
    one: Field<u8>,
    two: Field<u8>,
    three: Field<u8>,
}

fn main() {
    let num_field = Field::Present(Some(100));
    // Calling map gets the value out of the Option within Present
    assert_eq!(200, num_field.map(|n| n * 2));
    // Calling map_present gets the option out of Present
    assert_eq!(false, num_field.map_present(|opt| opt.is_none()));
}

功能

默认情况下,optional-field依赖serde和serde宏。如果您希望在不需要serde的情况下使用optional-field,可以将default-features设置为false。

[dependencies]
optional-field = { version = "0.1.5", default-features = false }

许可证

MIT许可证(LICENSE.txthttp://opensource.org/licenses/MIT

依赖项

~1.5MB
~41K SLoC