derived_cms_derive/
lib.rs

1use quote::quote;
2use syn::{parse_macro_input, Data, DeriveInput};
3use util::found_crate;
4
5mod entity;
6mod input;
7mod util;
8
9#[proc_macro_derive(Entity, attributes(cms))]
10pub fn derive_entity(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
11    let input = parse_macro_input!(input as DeriveInput);
12
13    match &input.data {
14        Data::Struct(data) => {
15            entity::derive_struct(&input, data).unwrap_or_else(syn::Error::into_compile_error)
16        }
17        _ => quote!(compile_error!("`Entity` can only be derived for `struct`s")),
18    }
19    .into()
20}
21
22#[proc_macro_derive(Input, attributes(cms))]
23pub fn derive_input(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
24    let input = parse_macro_input!(input as DeriveInput);
25
26    match &input.data {
27        Data::Struct(data) => input::derive_struct(&input, data),
28        Data::Enum(data) => input::derive_enum(&input, data),
29        _ => Ok(quote!(compile_error!(
30            "`Entity` can only be derived for `struct`s and `enum`s"
31        ))),
32    }
33    .unwrap_or_else(syn::Error::into_compile_error)
34    .into()
35}
36
37#[proc_macro_derive(Column, attributes(cms))]
38pub fn derive_column(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
39    let found_crate = found_crate();
40    let input = parse_macro_input!(input as DeriveInput);
41    let ident = input.ident;
42    quote! {
43        impl Column for #ident {
44            fn render(&self, _i18n: &#found_crate::derive::i18n_embed::fluent::FluentLanguageLoader) -> #found_crate::derive::maud::Markup {
45                #found_crate::derive::maud::html!((self))
46            }
47        }
48    }
49    .into()
50}