#options #maybe #undefined #void #replace

possible

Rust 库,提供三个状态的枚举,用于区分显式 null 值和值的缺失

1 个不稳定版本

0.1.0 2021 年 8 月 6 日

#1064编码

Download history 173/week @ 2024-03-14 89/week @ 2024-03-21 120/week @ 2024-03-28 122/week @ 2024-04-04 144/week @ 2024-04-11 121/week @ 2024-04-18 88/week @ 2024-04-25 149/week @ 2024-05-02 81/week @ 2024-05-09 24/week @ 2024-05-16 40/week @ 2024-05-23 103/week @ 2024-05-30 109/week @ 2024-06-06 108/week @ 2024-06-13 125/week @ 2024-06-20 46/week @ 2024-06-27

每月 411 次下载

MIT/Apache

54KB
624

Possible

Possible 库提供了三个状态的枚举,用于区分显式 null 值和值的缺失。该库旨在与 serde 序列化和反序列化一起使用,以解决 Option 在处理 null 值和值缺失时的歧义。

Possible 是三个可能性的枚举器 Some(T)NoneVoid。预期使用方式是,Some(T) 用于存储一些数据,类似于使用 OptionNone 代表显式的 null 值;而 Void 代表任何值的缺失。

Possible 实现了与 Option 相似的大部分功能,并且通常可以用作直接替代。尽管 NoneVoid 之间存在歧义,但它们在大多数 Option 功能中通常会被以相同的方式处理,以确保预期的行为。

安装

使用 cargo-edit,运行以下命令将此库添加到您的项目中。

cargo add possible

否则,将以下内容添加到您的项目 Cargo.toml 文件的 [dependencies] 表格部分。

# Under [dependencies]
possible = "0.1.0"

用法

在最简单的情况下,Possible 可以以类似于 Option 的方式使用。

use possible::Possible;

let possible_value: Possible<u32> = Possible::Some(42);
assert_eq!(possible_value, Possible::Some(42));

if let Possible::Some(value) = possible_value {
    assert_eq!(value, 42);
}

let halved_possible_value = possible_value.map(|value| value / 2);
assert_eq!(halved_possible_value, Possible::Some(21));

let unwrapped_value = possible_value.unwrap();
assert_eq!(unwrapped_value, 42);

匹配可以类似于 Option 类型变体进行。

use possible::Possible;

let possible_value: Possible<u32> = Default::default(); // defaults to Possible::Void

if let Possible::Void = possible_value {
    // semantically means there is an absense of any value stored
}

match possible_value {
    Possible::Void => { /* the default variant implying no value */ }
    Possible::None => { /* like Option::None, a null or empty value */ }
    Possible::Some(value) => { /* like Option::Some, a value of some type */ }
}

assert_eq!(possible_value.is_void(), true);
assert_eq!(possible_value.is_none(), false);
assert_eq!(possible_value.is_some(), false);

此库的主要用途是与 serde 一起进行序列化和反序列化,例如从 JSON 格式。当 null 值(或 None)是有效值,但值缺失仍然很重要时,这非常有用。

use serde::Serialize;
use serde_json::json;
use possible::Possible;

// serde(skip_serializing_if = "Possible::is_void") is required to implicitly
// omit values that are set as Possible::Void from being serialized

#[derive(Debug, Serialize, PartialEq)]
pub struct OutputJsonData {
    id: i64,

    #[serde(skip_serializing_if = "Possible::is_void")]
    name: Possible<String>,

    #[serde(skip_serializing_if = "Possible::is_void")]
    enabled: Possible<bool>,
}

let intended_output = OutputJsonData {
    id: 1324,
    name: Possible::Void,
    enabled: Possible::Some(true),
};

let serialized = serde_json::to_string(&intended_output).unwrap();
assert_eq!(serialized, r#"{"id":1324,"enabled":true}"#);
use serde::Deserialize;
use possible::Possible;

let input = r#"{
    "id": 1324,
    "name": "Ferris"
}"#;

// serde(default) is required to implicitly parse
// missing values as Possible::Void instead of Possible::None

#[derive(Debug, Deserialize, PartialEq)]
pub struct InputJsonData {
    id: i64,

    #[serde(default)]
    name: Possible<String>,

    #[serde(default)]
    enabled: Possible<bool>,
}

let parsed_input: InputJsonData = serde_json::from_str(input).unwrap();
assert_eq!(parsed_input, InputJsonData {
    id: 1324,
    name: Possible::Some( String::from("Ferris") ),
    enabled: Possible::Void,
});

贡献

欢迎提交拉取请求。对于重大更改,请先提交一个问题来讨论您想进行更改的内容。

请确保适当地更新测试。

许可证

MITApache 2

依赖项

~0.4–1MB
~23K SLoC