1extern crate darling;
2extern crate once_cell;
3extern crate proc_macro;
4extern crate proc_macro2;
5extern crate quote;
6extern crate syn;
7
8use proc_macro::TokenStream;
9
10use darling::FromMeta;
11use syn::{parse_macro_input, ItemStruct};
12
13mod model;
14mod utility;
15
16macro_rules! parse_nested_meta {
17 ($ty:ty, $args:expr) => {{
18 let meta = match darling::ast::NestedMeta::parse_meta_list(proc_macro2::TokenStream::from(
19 $args,
20 )) {
21 Ok(v) => v,
22 Err(e) => {
23 return TokenStream::from(darling::Error::from(e).write_errors());
24 }
25 };
26
27 match <$ty>::from_list(&meta) {
28 Ok(object_args) => object_args,
29 Err(err) => return TokenStream::from(err.write_errors()),
30 }
31 }};
32}
33#[derive(FromMeta, Debug)]
34struct ModelArgs {
35 coll_name: String,
36 observer: Option<()>,
37}
38
39#[proc_macro_attribute]
40#[allow(non_snake_case)]
41pub fn Model(args: TokenStream, item: TokenStream) -> TokenStream {
42 let __struct = parse_macro_input!(item as ItemStruct);
43 let model_args = parse_nested_meta!(ModelArgs, args);
44 match model::generate(&__struct, &model_args) {
45 Ok(expanded) => expanded,
46 Err(err) => err.write_errors().into(),
47 }
48}