edc_dataplane_macros/
lib.rs

1use interface::Interface;
2use syn::{parse_macro_input, ItemTrait};
3mod interface;
4use darling::FromMeta;
5
6macro_rules! parse_nested_meta {
7    ($ty:ty, $args:expr) => {{
8        let meta = match darling::ast::NestedMeta::parse_meta_list(proc_macro2::TokenStream::from(
9            $args,
10        )) {
11            Ok(v) => v,
12            Err(e) => {
13                return proc_macro::TokenStream::from(darling::Error::from(e).write_errors());
14            }
15        };
16
17        match <$ty>::from_list(&meta) {
18            Ok(object_args) => object_args,
19            Err(err) => return proc_macro::TokenStream::from(err.write_errors()),
20        }
21    }};
22}
23
24#[proc_macro_attribute]
25pub fn interface(
26    args: proc_macro::TokenStream,
27    original: proc_macro::TokenStream,
28) -> proc_macro::TokenStream {
29    let interface = parse_nested_meta!(Interface, args);
30    let item_trait: ItemTrait = parse_macro_input!(original as ItemTrait);
31    interface::generate(&interface, &item_trait)
32}