poem_mcpserver_macros/
lib.rs1mod 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}