turul_mcp_protocol_2025_06_18/
param_extraction.rs1use crate::traits::{Params, SerdeParamExtractor};
7
8#[macro_export]
10macro_rules! impl_serde_extractor {
11 ($param_type:ty) => {
12 impl $crate::traits::SerdeParamExtractor<$param_type> for $param_type {
13 type Error = $crate::McpError;
14
15 fn extract_serde(
16 params: turul_mcp_json_rpc_server::RequestParams,
17 ) -> Result<$param_type, Self::Error> {
18 let value = params.to_value();
20
21 serde_json::from_value(value).map_err(|e| {
23 $crate::McpError::InvalidParameters(format!(
24 "Failed to deserialize {}: {}",
25 stringify!($param_type),
26 e
27 ))
28 })
29 }
30 }
31 };
32}
33
34impl_serde_extractor!(crate::tools::CallToolParams);
37impl_serde_extractor!(crate::tools::ListToolsParams);
38impl_serde_extractor!(crate::resources::ListResourcesParams);
39impl_serde_extractor!(crate::resources::ListResourceTemplatesParams);
40impl_serde_extractor!(crate::resources::ReadResourceParams);
41impl_serde_extractor!(crate::prompts::ListPromptsParams);
43impl_serde_extractor!(crate::prompts::GetPromptParams);
44impl_serde_extractor!(crate::completion::CompleteParams);
45impl_serde_extractor!(crate::logging::SetLevelParams);
46impl_serde_extractor!(crate::elicitation::ElicitCreateParams);
51impl_serde_extractor!(crate::sampling::CreateMessageParams);
52impl_serde_extractor!(crate::ping::EmptyParams);
53impl_serde_extractor!(crate::resources::SubscribeParams);
54impl_serde_extractor!(crate::resources::UnsubscribeParams);
55
56pub fn extract_params<T>(
58 params: turul_mcp_json_rpc_server::RequestParams,
59) -> Result<T, crate::McpError>
60where
61 T: Params + SerdeParamExtractor<T, Error = crate::McpError>,
62{
63 T::extract_serde(params)
64}
65
66pub fn extract_optional_params<T>(
68 params: Option<turul_mcp_json_rpc_server::RequestParams>,
69) -> Result<T, crate::McpError>
70where
71 T: Params + SerdeParamExtractor<T, Error = crate::McpError> + Default,
72{
73 match params {
74 Some(p) => extract_params(p),
75 None => Ok(T::default()),
76 }
77}