1use proc_macro2::TokenStream;
4use quote::quote;
5
6use crate::analyze::model::analyze_model;
7use crate::generate::db_enum::generate_db_enum;
8use crate::generate::model::generate_model;
9use crate::generate::patch::generate_patch;
10use crate::parse::db_enum::parse_db_enum;
11use crate::parse::model::parse_model;
12use crate::parse::patch::parse_patch;
13
14mod analyze;
15mod generate;
16mod parse;
17mod utils;
18
19pub fn derive_db_enum(input: TokenStream, config: MacroConfig) -> TokenStream {
21 match parse_db_enum(input) {
22 Ok(model) => generate_db_enum(&model, &config),
23 Err(error) => error.write_errors(),
24 }
25}
26
27pub fn derive_model(input: TokenStream, config: MacroConfig) -> TokenStream {
29 match parse_model(input).and_then(analyze_model) {
30 Ok(model) => generate_model(&model, &config),
31 Err(error) => error.write_errors(),
32 }
33}
34
35pub fn derive_patch(input: TokenStream, config: MacroConfig) -> TokenStream {
37 match parse_patch(input) {
38 Ok(patch) => generate_patch(&patch, &config),
39 Err(error) => error.write_errors(),
40 }
41}
42
43#[cfg_attr(doc, non_exhaustive)]
47pub struct MacroConfig {
48 pub rorm_path: TokenStream,
55
56 #[cfg(not(doc))]
57 pub non_exhaustive: private::NonExhaustive,
58}
59
60mod private {
61 pub struct NonExhaustive;
62}
63
64impl Default for MacroConfig {
65 fn default() -> Self {
66 Self {
67 rorm_path: quote! { ::rorm },
68 non_exhaustive: private::NonExhaustive,
69 }
70 }
71}