1use proc_macro::TokenStream;
2use quote::quote;
3
4pub(crate) mod attributes;
5pub(crate) mod blocks;
6pub(crate) mod column;
7pub(crate) mod errors;
8pub(crate) mod hook;
9pub(crate) mod info;
10pub(crate) mod relation;
11pub(crate) mod utils;
12
13use info::Info;
14
15#[proc_macro_derive(WeldsModel, attributes(welds, welds_path))]
16pub fn model_gen(input: TokenStream) -> TokenStream {
17 match model_gen_inner(input) {
18 Ok(q) => q,
19 Err(err) => quote! { std::compile_error!(#err); }.into(),
20 }
21}
22
23fn model_gen_inner(input: TokenStream) -> errors::Result<TokenStream> {
24 let ast: syn::DeriveInput = syn::parse(input).unwrap();
26 let info = Info::new(&ast)?;
27
28 let p1 = blocks::has_schema(&info);
30 let p2 = blocks::write_to_args(&info);
31 let p4 = blocks::define_schema(&info);
33 let p5 = blocks::table_info(&info);
34 let p6 = blocks::table_columns(&info);
35 let p7 = blocks::relations(&info);
36 let p8 = blocks::unique_identifier(&info);
37 let p9 = blocks::impl_struct(&info);
38 let p10 = blocks::try_from_row(&info);
39 let p11 = blocks::update_from_row(&info);
40 let p12 = blocks::write_col_default_check(&info);
41 let p13 = blocks::write_hooks(&info);
42 let p14 = blocks::write_primary_key_value(&info);
43 let p15 = blocks::foreign_key_partial_eq(&info);
44
45 let q = quote! {
46 #p1
47 #p2
48 #p4
50 #p5
51 #p6
52 #p7
53 #p8
54 #p9
55 #p10
56 #p11
57 #p12
58 #p13
59 #p14
60 #p15
61 };
62
63 Ok(q.into())
74}