deli_derive/
lib.rs

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/// Derive macro for implementing `Model` trait on structs
13#[proc_macro_derive(Model, attributes(deli))]
14pub fn model(item: TokenStream) -> TokenStream {
15    // Parse the input tokens into a syntax tree
16    let derive_input = parse_macro_input!(item as DeriveInput);
17
18    // Create a model from derive input
19    let model = match Model::from_derive_input(&derive_input) {
20        Ok(model) => model,
21        Err(err) => return err.write_errors().into(),
22    };
23
24    // Validate that the model does not contain any generics
25    match model.validate_no_generic() {
26        Ok(_) => {}
27        Err(err) => return err.write_errors().into(),
28    }
29
30    // Create a model context from model
31    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    // Return the output of derive macro
37    model_context.expand().into()
38}