mocopr_macros/
lib.rs

1//! Procedural macros for MoCoPr
2//!
3//! This crate provides convenient macros for defining MCP tools, resources,
4//! and other components with minimal boilerplate.
5
6use proc_macro::TokenStream;
7use syn::{DeriveInput, ItemFn, ItemStruct, parse_macro_input};
8
9mod prompt;
10mod resource;
11mod tool;
12
13/// Derive macro for automatically implementing ToolHandler
14#[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/// Derive macro for automatically implementing ResourceHandler
23#[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/// Derive macro for automatically implementing PromptHandler
32#[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/// Attribute macro for defining MCP tool functions
41#[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/// Attribute macro for defining MCP resource structs
51#[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/// Attribute macro for defining MCP prompt functions
61#[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}