makepad_tinyserde_derive/
lib.rs

1extern crate proc_macro;
2extern crate proc_macro2;
3use proc_macro2::{Span};
4
5mod shared;
6use crate::shared::*;
7
8mod serde_bin;
9use crate::serde_bin::*;
10
11mod serde_ron;
12use crate::serde_ron::*;
13
14mod serde_json;
15use crate::serde_json::*;
16
17use syn::{
18    parse_macro_input,
19    Data,
20    DataStruct,
21    Fields,
22    DeriveInput,
23};
24
25#[proc_macro_derive(SerBin)]
26pub fn derive_ser_bin(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
27    let input = parse_macro_input!(input as DeriveInput);
28    // ok we have an ident, its either a struct or a enum
29    let ts = match &input.data {
30        Data::Struct(DataStruct {fields: Fields::Named(fields), ..}) => {
31            derive_ser_bin_struct(&input, fields)
32        },
33        Data::Struct(DataStruct {fields: Fields::Unnamed(fields), ..}) => {
34            derive_ser_bin_struct_unnamed(&input, fields)
35        },
36        Data::Enum(enumeration) => {
37            derive_ser_bin_enum(&input, enumeration)
38        },
39        _ => error(Span::call_site(), "only structs or enums supported")
40    };
41    proc_macro::TokenStream::from(ts)
42}
43
44
45#[proc_macro_derive(DeBin)]
46pub fn derive_de_bin(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
47    let input = parse_macro_input!(input as DeriveInput);
48    // ok we have an ident, its either a struct or a enum
49    let ts = match &input.data {
50        Data::Struct(DataStruct {fields: Fields::Named(fields), ..}) => {
51            derive_de_bin_struct(&input, fields)
52        },
53        Data::Struct(DataStruct {fields: Fields::Unnamed(fields), ..}) => {
54            derive_de_bin_struct_unnamed(&input, fields)
55        },
56        Data::Enum(enumeration) => {
57            derive_de_bin_enum(&input, enumeration)
58        },
59        _ => error(Span::call_site(), "only structs or enums supported")
60    };
61    proc_macro::TokenStream::from(ts)
62}
63
64#[proc_macro_derive(SerRon)]
65pub fn derive_ser_ron(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
66    let input = parse_macro_input!(input as DeriveInput);
67    // ok we have an ident, its either a struct or a enum
68    let ts = match &input.data {
69        Data::Struct(DataStruct {fields: Fields::Named(fields), ..}) => {
70            derive_ser_ron_struct(&input, fields)
71        },
72        Data::Struct(DataStruct {fields: Fields::Unnamed(fields), ..}) => {
73            derive_ser_ron_struct_unnamed(&input, fields)
74        },
75        Data::Enum(enumeration) => {
76            derive_ser_ron_enum(&input, enumeration)
77        },
78        _ => error(Span::call_site(), "only structs or enums supported")
79    };
80    proc_macro::TokenStream::from(ts)
81}
82
83#[proc_macro_derive(DeRon)]
84pub fn derive_de_ron(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
85    let input = parse_macro_input!(input as DeriveInput);
86    // ok we have an ident, its either a struct or a enum
87    let ts = match &input.data {
88        Data::Struct(DataStruct {fields: Fields::Named(fields), ..}) => {
89            derive_de_ron_struct(&input, fields)
90        },
91        Data::Struct(DataStruct {fields: Fields::Unnamed(fields), ..}) => {
92            derive_de_ron_struct_unnamed(&input, fields)
93        },
94        Data::Enum(enumeration) => {
95            derive_de_ron_enum(&input, enumeration)
96        },
97        _ => error(Span::call_site(), "only structs or enums supported")
98    };
99    //println!("{}", ts.to_string());
100    proc_macro::TokenStream::from(ts)
101}
102
103#[proc_macro_derive(SerJson)]
104pub fn derive_ser_json(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
105    let input = parse_macro_input!(input as DeriveInput);
106    // ok we have an ident, its either a struct or a enum
107    let ts = match &input.data {
108        Data::Struct(DataStruct {fields: Fields::Named(fields), ..}) => {
109            derive_ser_json_struct(&input, fields)
110        },
111        Data::Struct(DataStruct {fields: Fields::Unnamed(fields), ..}) => {
112            derive_ser_json_struct_unnamed(&input, fields)
113        },
114        Data::Enum(enumeration) => {
115            derive_ser_json_enum(&input, enumeration)
116        },
117        _ => error(Span::call_site(), "only structs or enums supported")
118    };
119    proc_macro::TokenStream::from(ts)
120}
121
122#[proc_macro_derive(DeJson)]
123pub fn derive_de_json(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
124    let input = parse_macro_input!(input as DeriveInput);
125    // ok we have an ident, its either a struct or a enum
126    let ts = match &input.data {
127        Data::Struct(DataStruct {fields: Fields::Named(fields), ..}) => {
128            derive_de_json_struct(&input, fields)
129        },
130        Data::Struct(DataStruct {fields: Fields::Unnamed(fields), ..}) => {
131            derive_de_json_struct_unnamed(&input, fields)
132        },
133        Data::Enum(enumeration) => {
134            derive_de_json_enum(&input, enumeration)
135        },
136        _ => error(Span::call_site(), "only structs or enums supported")
137    };
138    //println!("{}",ts.to_string());
139    proc_macro::TokenStream::from(ts)
140}