xml_derive/
lib.rs

1use core::panic;
2use syn::{DeriveInput, parse_macro_input};
3
4pub(crate) mod attrs;
5mod field;
6mod generic;
7mod variant;
8mod xml_enum;
9mod xml_struct;
10
11pub(crate) use field::Field;
12pub(crate) use generic::*;
13pub(crate) use variant::Variant;
14pub(crate) use xml_enum::Enum;
15pub(crate) use xml_struct::NamedStruct;
16
17#[proc_macro_derive(XmlDeserialize, attributes(xml))]
18pub fn derive_xml_deserialize(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
19    let input = parse_macro_input!(input as DeriveInput);
20
21    match &input.data {
22        syn::Data::Enum(e) => Enum::parse(&input, e).impl_de(),
23        syn::Data::Struct(s) => NamedStruct::parse(&input, s).impl_de(),
24        syn::Data::Union(_) => panic!("Union not supported"),
25    }
26    .into()
27}
28
29#[proc_macro_derive(XmlSerialize, attributes(xml))]
30pub fn derive_xml_serialize(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
31    let input = parse_macro_input!(input as DeriveInput);
32
33    match &input.data {
34        syn::Data::Enum(e) => Enum::parse(&input, e).impl_se(),
35        syn::Data::Struct(s) => NamedStruct::parse(&input, s).impl_se(),
36        syn::Data::Union(_) => panic!("Union not supported"),
37    }
38    .into()
39}
40
41#[proc_macro_derive(XmlRootTag, attributes(xml))]
42pub fn derive_xml_root_tag(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
43    let input = parse_macro_input!(input as DeriveInput);
44
45    match &input.data {
46        syn::Data::Struct(s) => NamedStruct::parse(&input, s).impl_xml_root_tag(),
47        syn::Data::Enum(_) => panic!("Enum not supported as root"),
48        syn::Data::Union(_) => panic!("Union not supported as root"),
49    }
50    .into()
51}
52
53#[proc_macro_derive(XmlDocument, attributes(xml))]
54pub fn derive_xml_document(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
55    let input = parse_macro_input!(input as DeriveInput);
56
57    match &input.data {
58        syn::Data::Struct(_) => panic!("Struct not supported, use XmlRootTag instead"),
59        syn::Data::Enum(e) => Enum::parse(&input, e).impl_xml_document(),
60        syn::Data::Union(_) => panic!("Union not supported as root"),
61    }
62    .into()
63}
64
65#[proc_macro_derive(EnumVariants, attributes(xml))]
66pub fn derive_enum_variants(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
67    let input = parse_macro_input!(input as DeriveInput);
68
69    match &input.data {
70        syn::Data::Struct(_) => panic!("Struct not supported"),
71        syn::Data::Enum(e) => Enum::parse(&input, e).impl_enum_variants(),
72        syn::Data::Union(_) => panic!("Union not supported"),
73    }
74    .into()
75}
76
77#[proc_macro_derive(EnumUnitVariants, attributes(xml))]
78pub fn derive_enum_unit_variants(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
79    let input = parse_macro_input!(input as DeriveInput);
80
81    match &input.data {
82        syn::Data::Struct(_) => panic!("Struct not supported"),
83        syn::Data::Enum(e) => Enum::parse(&input, e).impl_enum_unit_variants(),
84        syn::Data::Union(_) => panic!("Union not supported"),
85    }
86    .into()
87}