1mod context;
2mod index_meta;
3mod model;
4mod model_field;
5
6use context::ModelContext;
7use darling::FromDeriveInput;
8use model::Model;
9use proc_macro::TokenStream;
10use syn::{parse_macro_input, DeriveInput};
11
12#[proc_macro_derive(Model, attributes(deli))]
14pub fn model(item: TokenStream) -> TokenStream {
15 let derive_input = parse_macro_input!(item as DeriveInput);
17
18 let model = match Model::from_derive_input(&derive_input) {
20 Ok(model) => model,
21 Err(err) => return err.write_errors().into(),
22 };
23
24 match model.validate_no_generic() {
26 Ok(_) => {}
27 Err(err) => return err.write_errors().into(),
28 }
29
30 let model_context = match ModelContext::try_from(&model) {
32 Ok(model_context) => model_context,
33 Err(err) => return err.write_errors().into(),
34 };
35
36 model_context.expand().into()
38}