2个不稳定版本
0.2.0 | 2019年6月12日 |
---|---|
0.1.0 | 2019年6月12日 |
#63 在 #derive-deserialize
344 每月下载次数
用于 serde_piecewise_default
9KB
109 行
serde-piecewise-default
使用serde的Option<T>
处理方式,通过实现Default
,让您可以轻松地一次性为所有字段指定默认值。
示例
use serde::Deserialize;
use serde_piecewise_default::DeserializePiecewiseDefault;
#[derive(DeserializePiecewiseDefault, PartialEq, Eq, Debug)]
struct Example {
value: u8,
enabled: bool,
}
impl Default for Example {
fn default() -> Self {
Example {
value: 20,
enabled: true,
}
}
}
let data: Example = serde_json::from_str(r#"{"value": 8}"#).unwrap();
assert_eq!(data, Example { value: 8, enabled: true });
let data: Example = serde_json::from_str(r#"{"enabled": false}"#).unwrap();
assert_eq!(data, Example { value: 20, enabled: false });
let data: Example = serde_json::from_str("{}").unwrap();
assert_eq!(data, Example { value: 20, enabled: true });
实现细节
#[derive(DeserializePiecewiseDefault)]
struct Example {
item1: i8,
item2: String,
}
将展开为
struct Example {
item1: i8,
item2: String,
}
#[derive(Deserialize)]
struct OptionExample {
item1: Option<i8>,
item2: Option<String>,
}
impl<'de> Deserialize<'de> for Example {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: serde::Deserializer<'de> {
<OptionExample as Deserialize>::deserialize(deserializer)
.map(|raw_result| {
let OptionExample { item1, item2 } = raw_result;
let default = <Example as Default>::default();
let item1 = item1.unwrap_or(default.item1);
let item2 = item2.unwrap_or(default.item2);
Example { item1, item2 }
})
}
}
lib.rs
:
有关更多信息,请参阅父crate文档。
依赖项
~0.5–1MB
~25K SLoC