spark_orm_derive/
lib.rs

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}