1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use syn::{DeriveInput, parse_macro_input};
5
6mod builder;
7mod factory_observer;
8mod models;
9mod parser;
10mod relationships;
11
12#[proc_macro_derive(Orm, attributes(orm))]
13pub fn rullst_macro(input: TokenStream) -> TokenStream {
14 let input = parse_macro_input!(input as DeriveInput);
15
16 let parsed = match parser::parse(&input) {
18 Ok(p) => p,
19 Err(e) => return TokenStream::from(e.to_compile_error()),
20 };
21
22 let rels = relationships::generate(&parsed);
24
25 let builder_code = builder::generate(
27 &parsed,
28 &rels.flags,
29 &rels.inits,
30 &rels.methods,
31 &rels.eager_loads,
32 );
33
34 let factory_observer_code = factory_observer::generate(&parsed);
36
37 let model_code = models::generate(&parsed, &rels.model_methods);
39
40 let expanded = quote::quote! {
42 #builder_code
43 #factory_observer_code
44 #model_code
45 };
46
47 TokenStream::from(expanded)
48}