turbomcp_server/routing/
traits.rs1use turbomcp_protocol::RequestContext;
4use turbomcp_protocol::{
5 jsonrpc::{JsonRpcRequest, JsonRpcResponse},
6 types::{
7 CreateMessageRequest, ElicitRequest, ElicitResult, ListRootsResult, PingRequest, PingResult,
8 },
9};
10
11use crate::ServerResult;
12
13#[async_trait::async_trait]
15pub trait ServerRequestDispatcher: Send + Sync {
16 async fn send_elicitation(
18 &self,
19 request: ElicitRequest,
20 ctx: RequestContext,
21 ) -> ServerResult<ElicitResult>;
22
23 async fn send_ping(
25 &self,
26 request: PingRequest,
27 ctx: RequestContext,
28 ) -> ServerResult<PingResult>;
29
30 async fn send_create_message(
32 &self,
33 request: CreateMessageRequest,
34 ctx: RequestContext,
35 ) -> ServerResult<turbomcp_protocol::types::CreateMessageResult>;
36
37 async fn send_list_roots(
39 &self,
40 request: turbomcp_protocol::types::ListRootsRequest,
41 ctx: RequestContext,
42 ) -> ServerResult<ListRootsResult>;
43
44 fn supports_bidirectional(&self) -> bool;
46
47 async fn get_client_capabilities(&self) -> ServerResult<Option<serde_json::Value>>;
49}
50
51#[async_trait::async_trait]
53pub trait RouteHandler: Send + Sync {
54 async fn handle(
56 &self,
57 request: JsonRpcRequest,
58 ctx: RequestContext,
59 ) -> ServerResult<JsonRpcResponse>;
60
61 fn can_handle(&self, method: &str) -> bool;
63
64 fn metadata(&self) -> RouteMetadata {
66 RouteMetadata::default()
67 }
68}
69
70#[derive(Debug, Clone)]
72pub struct RouteMetadata {
73 pub name: String,
75 pub description: Option<String>,
77 pub version: String,
79 pub methods: Vec<String>,
81 pub tags: Vec<String>,
83}
84
85impl Default for RouteMetadata {
86 fn default() -> Self {
87 Self {
88 name: "unknown".to_string(),
89 description: None,
90 version: "1.0.0".to_string(),
91 methods: Vec::new(),
92 tags: Vec::new(),
93 }
94 }
95}
96
97#[derive(Clone)]
99pub struct Route {
100 pub method: String,
102 pub handler: std::sync::Arc<dyn RouteHandler>,
104 pub metadata: RouteMetadata,
106}
107
108impl std::fmt::Debug for Route {
109 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
110 f.debug_struct("Route")
111 .field("method", &self.method)
112 .field("metadata", &self.metadata)
113 .finish()
114 }
115}