serde-piecewise-default

Travis Build Status Crates.io docs.rs

Uses serde's Option<T> handling to let you easily specify defaults for all fields at once by implementing Default.

Examples

```rust use serde::Deserialize; use serdepiecewisedefault::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 = serdejson::fromstr(r#"{"value": 8}"#).unwrap(); asserteq!(data, Example { value: 8, enabled: true }); let data: Example = serdejson::fromstr(r#"{"enabled": false}"#).unwrap(); asserteq!(data, Example { value: 20, enabled: false }); let data: Example = serdejson::fromstr("{}").unwrap(); assert_eq!(data, Example { value: 20, enabled: true }); ```

Implementation Details

```rust

[derive(DeserializePiecewiseDefault)]

struct Example { item1: i8, item2: String, } will expand to rust struct Example { item1: i8, item2: String, }

[derive(Deserialize)]

struct OptionExample { item1: Option, item2: Option, }

impl<'de> Deserialize<'de> for Example { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { ::deserialize(deserializer) .map(|rawresult| { let OptionExample { item1, item2 } = rawresult; let default = ::default(); let item1 = item1.unwrapor(default.item1); let item2 = item2.unwrapor(default.item2); Example { item1, item2 } }) } } ```