1extern crate proc_macro;
2
3pub(crate) mod attr;
4mod bound;
5mod de;
6mod ser;
7
8use std::convert::From;
9use syn::{parse_macro_input, Data, DeriveInput, Error};
10
11#[derive(Debug)]
12enum TagType {
13 External,
14 Internal(String),
15 Untagged,
16 Adjacent { tag: String, content: String },
17}
18
19#[proc_macro_derive(Serialize_enum, attributes(serde))]
20pub fn derive_serialize(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
21 let input = parse_macro_input!(tokens as DeriveInput);
22 let en = match &input.data {
23 Data::Enum(en) => en,
24 _ => {
25 return Error::new_spanned(input, "Serialize_enum can only be applied to enums")
26 .to_compile_error()
27 .into()
28 }
29 };
30 ser::derive(&input, &en)
31 .unwrap_or_else(|err| err.to_compile_error())
32 .into()
33}
34
35#[proc_macro_derive(Deserialize_enum, attributes(serde))]
36pub fn derive_deserialize(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
37 let input = parse_macro_input!(tokens as DeriveInput);
38 let en = match &input.data {
39 Data::Enum(en) => en,
40 _ => {
41 return Error::new_spanned(input, "Serialize_enum can only be applied to enums")
42 .to_compile_error()
43 .into()
44 }
45 };
46 de::derive(&input, &en)
47 .unwrap_or_else(|err| err.to_compile_error())
48 .into()
49}