Macro tokenizers::impl_serde_type

source ·
macro_rules! impl_serde_type {
    (
     $(#[$meta:meta])*
     $vis:vis struct $struct_name:ident {
        $(
        $(#[$field_meta:meta])*
        $field_vis:vis $field_name:ident : $field_type:ty
        ),*$(,)+
    }
    ) => { ... };
    (
     $(#[$meta:meta])*
     $vis:vis struct $struct_name:ident;
    ) => { ... };
}
Expand description

Implement serde::{Serialize, Serializer} with #[serde(tag = "type")] attribute for a given struct. Panic when a json string being deserilized misses field type.

§Examples

use serde::{Serialize, Deserialize};

fn main() {
   impl_serde_type!{
       #[derive(Debug)]
       struct Point {
           x: i32,
           #[serde(default = "default_y")]
           y: i32,
       }
   }
   fn default_y() -> i32 {
       5
   }

   let point = Point { x: 1, y: 2 };
   let serialized_s = r#"{"type":"Point","x":1,"y":2}"#;
   assert_eq!(serde_json::to_string(&point).unwrap(), serialized_s);
}
use serde::{Serialize, Deserialize};

fn main() {
   impl_serde_type!{
       #[derive(Debug)]
       struct Point1D {
           x: i32,
       }
   }

   let serialized_s = r#"{"x":1}"#;
   let deserialized: Point1D = serde_json::from_str(serialized_s).unwrap();
}

§Examples (unit structs)

use serde::{Serialize, Deserialize};

fn main() {
   impl_serde_type!{
       struct Unit;
   }

   let unit = Unit;
   let serialized_s = r#"{"type":"Unit"}"#;
   assert_eq!(serde_json::to_string(&unit).unwrap(), serialized_s);
}
use serde::{Serialize, Deserialize};

fn main() {
   impl_serde_type!{
       struct Unit;
   }

   let serialized_s = r#"{"some_field":1}"#;
   let deserialized: Unit = serde_json::from_str(serialized_s).unwrap();
}