1use log::trace;
2use syn::{parse_macro_input, spanned::Spanned, Data, DeriveInput, Fields};
3mod i18n;
4#[proc_macro_derive(I18n, attributes(i18n))]
18pub fn i18n_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
19 env_logger::init();
20 trace!("Parsing i18n attribute: {input}");
21 let input = parse_macro_input!(input as DeriveInput);
22 let span = input.span();
23 match input.data {
24 Data::Struct(data) => match data.fields {
25 Fields::Named(fields) => {
26 i18n::parse_named_struct(span, input.vis, input.ident, fields)
27 }
28 Fields::Unnamed(fields) => {
29 i18n::parse_unnamed_struct(span, input.vis, input.ident, fields)
30 }
31 Fields::Unit => {
32 i18n::parse_unit_struct(span, input.vis, input.ident)
33 }
34 },
35 Data::Enum(data) => {
36 i18n::parse_enum(span, input.vis, input.ident, data)
37 }
38 Data::Union(_) => panic!("I18n cannot be derived for unions"),
39 }
40 .unwrap()
41 .into()
42}