Skip to main content

algosul_marco/
lib.rs

1use log::trace;
2use syn::{parse_macro_input, spanned::Spanned, Data, DeriveInput, Fields};
3mod i18n;
4/// # Example
5/// ```
6/// # use ::algosul_marco::I18n;
7/// #[derive(I18n)]
8/// struct Text {
9///     #[i18n(ignore)]
10///     ignore: (),
11///     #[i18n(rename = "name")]
12///     name:   String,
13///     #[i18n(format(name))]
14///     format: String,
15/// }
16/// ```
17#[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}