poem_mcpserver_macros/
lib.rs

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