1 个不稳定版本
0.1.0 | 2021 年 8 月 6 日 |
---|
#1064 在 编码
每月 411 次下载
54KB
624 行
Possible
Possible 库提供了三个状态的枚举,用于区分显式 null 值和值的缺失。该库旨在与 serde
序列化和反序列化一起使用,以解决 Option
在处理 null 值和值缺失时的歧义。
Possible
是三个可能性的枚举器 Some(T)
、None
和 Void
。预期使用方式是,Some(T)
用于存储一些数据,类似于使用 Option
;None
代表显式的 null 值;而 Void
代表任何值的缺失。
Possible
实现了与 Option
相似的大部分功能,并且通常可以用作直接替代。尽管 None
和 Void
之间存在歧义,但它们在大多数 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,
});
贡献
欢迎提交拉取请求。对于重大更改,请先提交一个问题来讨论您想进行更改的内容。
请确保适当地更新测试。
许可证
依赖项
~0.4–1MB
~23K SLoC