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 编码
每月下载量 1,413
在 2 个crate中使用(通过fractal-storage-client)
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方法,例如map
、unwrap
、as_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 }
许可证
依赖项
~1.5MB
~41K SLoC