#serialization #unit #deserialize #derive-deserialize #struct #no-alloc #serde-unit-struct

macro no-std serde_unit_struct_derive

Proc-macro engine for serde_unit_struct

3 releases

0.1.3 Dec 16, 2023
0.1.2 Nov 8, 2023
0.1.1 Apr 15, 2022
0.1.0 Mar 1, 2022

#55 in #derive-deserialize

Download history 308/week @ 2023-12-18 210/week @ 2023-12-25 324/week @ 2024-01-01 482/week @ 2024-01-08 664/week @ 2024-01-15 683/week @ 2024-01-22 1171/week @ 2024-01-29 743/week @ 2024-02-05 807/week @ 2024-02-12 429/week @ 2024-02-19 770/week @ 2024-02-26 645/week @ 2024-03-04 697/week @ 2024-03-11 715/week @ 2024-03-18 801/week @ 2024-03-25 1029/week @ 2024-04-01

3,275 downloads per month
Used in 2 crates (via serde_unit_struct)

MIT/Apache

6KB
53 lines

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:

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:

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<Bar, _> = serde_json::from_str(&json);
    assert!(bar.is_err());
}

License

Licensed under either of Apache License, Version 2.0 or MIT license 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.

Dependencies

~285–730KB
~17K SLoC