turbomcp_server/handlers/
wrapper.rs1use serde_json::Value;
4use std::collections::HashMap;
5use std::sync::Arc;
6
7pub struct HandlerWrapper<T> {
9 handler: Arc<T>,
11 metadata: HandlerMetadata,
13}
14
15impl<T> std::fmt::Debug for HandlerWrapper<T> {
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 f.debug_struct("HandlerWrapper")
18 .field("metadata", &self.metadata)
19 .finish()
20 }
21}
22
23#[derive(Debug, Clone)]
25pub struct HandlerMetadata {
26 pub name: String,
28 pub version: String,
30 pub description: Option<String>,
32 pub tags: Vec<String>,
34 pub created_at: chrono::DateTime<chrono::Utc>,
36 pub config: HashMap<String, Value>,
38 pub metrics_enabled: bool,
40 pub rate_limit: Option<u32>,
42 pub allowed_roles: Option<Vec<String>>,
44}
45
46impl Default for HandlerMetadata {
47 fn default() -> Self {
48 Self {
49 name: "unnamed".to_string(),
50 version: "1.0.0".to_string(),
51 description: None,
52 tags: Vec::new(),
53 created_at: chrono::Utc::now(),
54 config: HashMap::new(),
55 metrics_enabled: true,
56 rate_limit: None,
57 allowed_roles: None,
58 }
59 }
60}
61
62impl<T> HandlerWrapper<T> {
63 pub fn new(handler: T) -> Self {
65 Self {
66 handler: Arc::new(handler),
67 metadata: HandlerMetadata::default(),
68 }
69 }
70
71 pub fn with_metadata(handler: T, metadata: HandlerMetadata) -> Self {
73 Self {
74 handler: Arc::new(handler),
75 metadata,
76 }
77 }
78
79 #[must_use]
81 pub const fn handler(&self) -> &Arc<T> {
82 &self.handler
83 }
84
85 #[must_use]
87 pub const fn metadata(&self) -> &HandlerMetadata {
88 &self.metadata
89 }
90
91 pub fn update_metadata<F>(&mut self, f: F)
93 where
94 F: FnOnce(&mut HandlerMetadata),
95 {
96 f(&mut self.metadata);
97 }
98}
99
100impl<T: Clone> Clone for HandlerWrapper<T> {
101 fn clone(&self) -> Self {
102 Self {
103 handler: Arc::clone(&self.handler),
104 metadata: self.metadata.clone(),
105 }
106 }
107}