derive_jinja_renderer/
lib.rs1mod all_events;
2mod context;
3mod event;
4
5use all_events::generate_all_events_fn;
6use context::generate_render_context_trait;
7use darling::{FromDeriveInput, FromField, FromVariant};
8use event::generate_event_trait;
9use proc_macro::TokenStream;
10use syn::{parse_macro_input, DeriveInput, Ident};
11
12#[derive(Debug, FromDeriveInput)]
13#[darling(attributes(template))]
14struct TemplateOptions {
15 ident: Ident,
16 generics: syn::Generics,
17 name: String,
18 #[darling(default)]
19 mime: Option<String>,
20}
21
22#[derive(Debug, FromDeriveInput)]
23#[darling(attributes(event), forward_attrs(template))]
24struct EventOptions {
25 ident: Ident,
26 generics: syn::Generics,
27 #[darling(default)]
28 name: String,
29 #[darling(default)]
30 receivers: String,
31 #[darling(default = "default_target")]
32 target: String,
33 #[darling(default = "default_swap")]
34 swap: String,
35 #[darling(default = "default_id_field")]
36 id_field: String,
37 #[darling(default = "default_id_prefix")]
38 id_prefix: String,
39 data: darling::ast::Data<EnumData, FieldData>,
40 attrs: Vec<syn::Attribute>,
41}
42
43#[derive(Debug, FromDeriveInput)]
44struct AllEventsOptions {
45 ident: Ident,
46 generics: syn::Generics,
47 vis: syn::Visibility,
48 data: darling::ast::Data<EnumData, darling::util::Ignored>,
49}
50
51#[derive(Debug, FromField)]
52struct FieldData {
53 ident: Option<syn::Ident>,
54 ty: syn::Type,
55}
56
57#[derive(Debug, FromVariant)]
58struct EnumData {
59 ident: syn::Ident,
60 fields: darling::ast::Fields<FieldData>,
61}
62
63#[proc_macro_derive(Template, attributes(template))]
64pub fn derive_template(input: TokenStream) -> TokenStream {
65 let input = parse_macro_input!(input as DeriveInput);
66 let options = TemplateOptions::from_derive_input(&input).expect("failed to parse input");
67 generate_render_context_trait(options).into()
68}
69
70#[proc_macro_derive(Event, attributes(event))]
71pub fn derive_event(input: TokenStream) -> TokenStream {
72 let input = parse_macro_input!(input as DeriveInput);
73 let options = EventOptions::from_derive_input(&input).expect("failed to parse input");
74 generate_event_trait(options).into()
75}
76
77#[proc_macro_derive(AllEvents)]
78pub fn derive_all_events(input: TokenStream) -> TokenStream {
79 let input = parse_macro_input!(input as DeriveInput);
80 let options = AllEventsOptions::from_derive_input(&input).expect("failed to parse input");
81 generate_all_events_fn(options).into()
82}
83
84fn default_swap() -> String {
85 "innerHTML".to_string()
86}
87
88fn default_target() -> String {
89 "dynamic".to_string()
90}
91
92fn default_id_field() -> String {
93 "id".to_string()
94}
95
96fn default_id_prefix() -> String {
97 "#id-".to_string()
98}