#serde #derive #serialization #derive-deserialize

serde_piecewise_default

使用 serde 的 Option 处理方式,通过实现 Default 接口,让您轻松一次指定所有字段的默认值。

2 个不稳定版本

0.2.0 2019年6月12日
0.1.0 2019年6月12日

#1940编码

Download history • Rust 包仓库 366/week @ 2024-03-07 • Rust 包仓库 326/week @ 2024-03-14 • Rust 包仓库 147/week @ 2024-03-21 • Rust 包仓库 370/week @ 2024-03-28 • Rust 包仓库 203/week @ 2024-04-04 • Rust 包仓库 508/week @ 2024-04-11 • Rust 包仓库 226/week @ 2024-04-18 • Rust 包仓库 140/week @ 2024-04-25 • Rust 包仓库 72/week @ 2024-05-02 • Rust 包仓库 53/week @ 2024-05-09 • Rust 包仓库 19/week @ 2024-05-16 • Rust 包仓库 83/week @ 2024-05-23 • Rust 包仓库 61/week @ 2024-05-30 • Rust 包仓库 97/week @ 2024-06-06 • Rust 包仓库 66/week @ 2024-06-13 • Rust 包仓库 71/week @ 2024-06-20 • Rust 包仓库

329 每月下载次数

MIT 许可证

7KB

serde-piecewise-default

Travis Build Status Crates.io docs.rs

使用 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 }
            })
    }
}

依赖关系

~0.5–1MB
~25K SLoC