use optional_field::serde_optional_fields; use optional_field::Field::{self, *}; use serde::{Deserialize, Serialize}; use serde_json::json; #[serde_optional_fields] #[derive(Debug, Serialize, Deserialize)] struct Thing { mandatory: u8, option: Option, field: Field, } #[test] fn deserialize_missing() { let thing = serde_json::from_value::(json!( { "mandatory": 1, "option": null, } )) .unwrap(); assert_eq!(1, thing.mandatory); assert_eq!(None, thing.option); assert_eq!(Missing, thing.field); } #[test] fn deserialize_null() { let thing = serde_json::from_value::(json!( { "mandatory": 1, "option": 2, "field": null } )) .unwrap(); assert_eq!(1, thing.mandatory); assert_eq!(Some(2), thing.option); assert_eq!(Present(None), thing.field); } #[test] fn deserialize_value() { let thing = serde_json::from_value::(json!( { "mandatory": 1, "option": null, "field": 2 } )) .unwrap(); assert_eq!(1, thing.mandatory); assert_eq!(None, thing.option); assert_eq!(Present(Some(2)), thing.field); } #[test] fn serialize_value() { let thing = Thing { mandatory: 1, option: None, field: Present(Some(2)), }; let json = serde_json::to_value(thing).unwrap(); assert_eq!( json!( { "mandatory": 1, "option": null, "field": 2 } ), json ); } #[test] fn serialize_null() { let thing = Thing { mandatory: 1, option: Some(2), field: Present(None), }; let json = serde_json::to_value(thing).unwrap(); assert_eq!( json!( { "mandatory": 1, "option": 2, "field": null } ), json ); } #[test] fn serialize_missing() { let thing = Thing { mandatory: 1, option: None, field: Missing, }; let json = serde_json::to_value(thing).unwrap(); assert_eq!( json!( { "mandatory": 1, "option": null, } ), json ); } #[test] fn with_fqn() { #[serde_optional_fields] #[derive(Debug, Serialize, Deserialize)] struct WithFqn { field: optional_field::Field, } let thing = WithFqn { field: optional_field::Field::Present(Some(1)), }; let json = serde_json::to_value(thing).unwrap(); assert_eq!( json!( { "field": 1, } ), json ); }