1use proc_macro::TokenStream;
7use syn::{DeriveInput, ItemFn, ItemStruct, parse_macro_input};
8
9mod prompt;
10mod resource;
11mod tool;
12
13#[proc_macro_derive(Tool, attributes(tool))]
15pub fn derive_tool(input: TokenStream) -> TokenStream {
16 let input = parse_macro_input!(input as DeriveInput);
17 tool::derive_tool_impl(input)
18 .unwrap_or_else(|err| err.to_compile_error())
19 .into()
20}
21
22#[proc_macro_derive(Resource, attributes(resource))]
24pub fn derive_resource(input: TokenStream) -> TokenStream {
25 let input = parse_macro_input!(input as DeriveInput);
26 resource::derive_resource_impl(input)
27 .unwrap_or_else(|err| err.to_compile_error())
28 .into()
29}
30
31#[proc_macro_derive(Prompt, attributes(prompt))]
33pub fn derive_prompt(input: TokenStream) -> TokenStream {
34 let input = parse_macro_input!(input as DeriveInput);
35 prompt::derive_prompt_impl(input)
36 .unwrap_or_else(|err| err.to_compile_error())
37 .into()
38}
39
40#[proc_macro_attribute]
42pub fn mcp_tool(args: TokenStream, input: TokenStream) -> TokenStream {
43 let args = parse_macro_input!(args as syn::Meta);
44 let input = parse_macro_input!(input as ItemFn);
45 tool::mcp_tool_impl(args, input)
46 .unwrap_or_else(|err| err.to_compile_error())
47 .into()
48}
49
50#[proc_macro_attribute]
52pub fn mcp_resource(args: TokenStream, input: TokenStream) -> TokenStream {
53 let args = parse_macro_input!(args as syn::Meta);
54 let input = parse_macro_input!(input as ItemStruct);
55 resource::mcp_resource_impl(args, input)
56 .unwrap_or_else(|err| err.to_compile_error())
57 .into()
58}
59
60#[proc_macro_attribute]
62pub fn mcp_prompt(args: TokenStream, input: TokenStream) -> TokenStream {
63 let args = parse_macro_input!(args as syn::Meta);
64 let input = parse_macro_input!(input as ItemFn);
65 prompt::mcp_prompt_impl(args, input)
66 .unwrap_or_else(|err| err.to_compile_error())
67 .into()
68}