edc_dataplane_macros/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use interface::Interface;
use syn::{parse_macro_input, ItemTrait};
mod interface;
use darling::FromMeta;

macro_rules! parse_nested_meta {
    ($ty:ty, $args:expr) => {{
        let meta = match darling::ast::NestedMeta::parse_meta_list(proc_macro2::TokenStream::from(
            $args,
        )) {
            Ok(v) => v,
            Err(e) => {
                return proc_macro::TokenStream::from(darling::Error::from(e).write_errors());
            }
        };

        match <$ty>::from_list(&meta) {
            Ok(object_args) => object_args,
            Err(err) => return proc_macro::TokenStream::from(err.write_errors()),
        }
    }};
}

#[proc_macro_attribute]
pub fn interface(
    args: proc_macro::TokenStream,
    original: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    let interface = parse_nested_meta!(Interface, args);
    let item_trait: ItemTrait = parse_macro_input!(original as ItemTrait);
    interface::generate(&interface, &item_trait)
}