1use crate::tool::CustomTool;
2
3#[macro_export]
4macro_rules! setup_tools {
5 ($visibility:vis $enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
6 $visibility struct $enum_name {
7 inner: __tool_setup::InnerTools,
8 }
9
10 mod __tool_setup {
11 use super::*;
12
13 rust_mcp_sdk::tool_box!(InnerTools, [$($tool),*]);
14 }
15
16 impl $crate::server_prelude::ToolBox for $enum_name {
17 fn get_tool(&self) -> $crate::tool_prelude::CustomTool {
18 match &self.inner {
19 $(
20 __tool_setup::InnerTools::$tool(tool_value) => $crate::tool_prelude::CustomTool::$tool_kind(tool_value),
21 )*
22 }
23 }
24
25 fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool> {
26 __tool_setup::InnerTools::tools()
27 }
28 }
29
30 impl TryFrom<rust_mcp_sdk::schema::CallToolRequestParams> for $enum_name {
31 type Error = rust_mcp_sdk::schema::schema_utils::CallToolError;
32
33 fn try_from(value: rust_mcp_sdk::schema::CallToolRequestParams) -> Result<Self, Self::Error> {
34 Ok(Self {
35 inner: __tool_setup::InnerTools::try_from(value)?,
36 })
37 }
38 }
39 };
40 ($enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
41 setup_tools!(pub(crate) $enum_name, [$($tool_kind ( $tool ) ),*]);
42 };
43}
44pub use setup_tools;
45
46pub trait ToolBox {
47 fn get_tool(&'_ self) -> CustomTool<'_>;
48
49 fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool>;
50}