1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#![macro_use]

macro_rules! declare_json_object {
    (
        $(#[$attribute:meta])*
        $struct_vis:vis
        struct $struct_name:ident {
            $($member_vis:vis $member_name:ident : $member_type:ty,)*
        }
    ) => {
        #[allow(non_snake_case)]
        $(#[$attribute])*
        $struct_vis struct $struct_name {
            $($member_vis $member_name : $member_type,)*
        }
        impl<'json> $crate::json::FromJson<'json> for $struct_name {
            fn from_json(
                value: $crate::json::JsonValue,
                json: &'json $crate::json::Json,
            ) -> Result<Self, $crate::json::JsonConvertError> {
                match value {
                    JsonValue::Object(object) => {
                        let mut this = Self {
                            $($member_name : Default::default(),)*
                        };
                        for (key, value) in object.members(json) {
                            match key {
                                $(stringify!($member_name) => {
                                    this.$member_name = $crate::json::FromJson::from_json(value, json)?
                                })*
                                _ => (),
                            }
                        }
                        Ok(this)
                    }
                    _ => Err($crate::json::JsonConvertError)
                }
            }
        }
    }
}