Serde Unit Struct Derive ======================== This crate provides derive macros for Serde's `Serialize` and `Deserialize` traits on unit structs, such that the unit struct is represented by its name as a string. This is useful if you wish to maintain type information, i.e. differentiate between different unit structs. Without `serde_unit_struct`: ```rust use serde::{Deserialize, Serialize}; #[derive(Deserialize, Serialize)] struct Foo; #[derive(Deserialize, Serialize)] struct Bar; fn main() { // Normally, unit structs serialize to null. let json = serde_json::to_string(&Foo).unwrap(); assert_eq!(json, "null"); // We can successfully deserialize them, but... let foo: Foo = serde_json::from_str(&json).unwrap(); assert_eq!(foo, Foo); // ...this also works; the type information is lost. let bar: Bar = serde_json::from_str(&json).unwrap(); assert_eq!(bar, Bar); } ``` With `serde_unit_struct`: ```rust use serde_unit_struct::{Deserialize_unit_struct, Serialize_unit_struct}; #[derive(Deserialize_unit_struct, Serialize_unit_struct)] struct Foo; #[derive(Deserialize_unit_struct, Serialize_unit_struct)] struct Bar; fn main() { // Now, unit structs serialise to their name as a string. let json = serde_json::to_string(&Foo).unwrap(); assert_eq!(json, "\"Foo\""); // We can successfully deserialize them. let foo: Foo = serde_json::from_str(&json).unwrap(); assert_eq!(foo, Foo); // Type information is maintained. let bar: Result = serde_json::from_str(&json); assert!(bar.is_err()); } ``` ## License Licensed under either of [Apache License, Version 2.0](LICENSE-APACHE) or [MIT license](LICENSE-MIT) at your option. Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.