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(mut value: rust_mcp_sdk::schema::CallToolRequestParams) -> Result<Self, Self::Error> {
34 value.arguments.get_or_insert_default();
35 Ok(Self {
36 inner: __tool_setup::InnerTools::try_from(value)?,
37 })
38 }
39 }
40 };
41 ($enum_name:ident, [$($tool_kind:ident ( $tool:ident ) ),* $(,)?]) => {
42 setup_tools!(pub(crate) $enum_name, [$($tool_kind ( $tool ) ),*]);
43 };
44}
45pub use setup_tools;
46
47pub trait ToolBox {
48 fn get_tool(&'_ self) -> CustomTool<'_>;
49
50 fn get_tools() -> Vec<rust_mcp_sdk::schema::Tool>;
51}