welds_macros/
lib.rs

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    // Gather the Info needed to build all the code snipits
25    let ast: syn::DeriveInput = syn::parse(input).unwrap();
26    let info = Info::new(&ast)?;
27
28    // write all the code snipits
29    let p1 = blocks::has_schema(&info);
30    let p2 = blocks::write_to_args(&info);
31    //let p3 = blocks::write_bulk_array_to_args(&info);
32    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        //#p3
49        #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    // // Want to see what the macros generate?
64    // // this works, or `rustaceanvim :RustLsp expandMacro`
65    // let code = q.to_string();
66    // std::fs::create_dir_all("/tmp/weldsmacro/");
67    // let filename = format!(
68    //     "/tmp/weldsmacro/{}.rs",
69    //     info.defstruct.to_string().to_lowercase()
70    // );
71    // std::fs::write(filename, code);
72
73    Ok(q.into())
74}