derived_cms_derive/
lib.rs1use 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}