turbomcp_server/handlers/
wrapper.rs

1//! Handler wrapper infrastructure for metadata and additional functionality
2
3use serde_json::Value;
4use std::collections::HashMap;
5use std::sync::Arc;
6
7/// Handler wrapper that provides additional functionality
8pub struct HandlerWrapper<T> {
9    /// The wrapped handler
10    handler: Arc<T>,
11    /// Handler metadata
12    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/// Metadata associated with a handler
24#[derive(Debug, Clone)]
25pub struct HandlerMetadata {
26    /// Handler name
27    pub name: String,
28    /// Handler version
29    pub version: String,
30    /// Handler description
31    pub description: Option<String>,
32    /// Handler tags
33    pub tags: Vec<String>,
34    /// Handler creation time
35    pub created_at: chrono::DateTime<chrono::Utc>,
36    /// Handler configuration
37    pub config: HashMap<String, Value>,
38    /// Handler metrics enabled
39    pub metrics_enabled: bool,
40    /// Handler rate limit (requests per second)
41    pub rate_limit: Option<u32>,
42    /// Allowed roles for authorization (if None or empty => allow all)
43    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    /// Create a new handler wrapper
64    pub fn new(handler: T) -> Self {
65        Self {
66            handler: Arc::new(handler),
67            metadata: HandlerMetadata::default(),
68        }
69    }
70
71    /// Create a wrapper with metadata
72    pub fn with_metadata(handler: T, metadata: HandlerMetadata) -> Self {
73        Self {
74            handler: Arc::new(handler),
75            metadata,
76        }
77    }
78
79    /// Get handler reference
80    #[must_use]
81    pub const fn handler(&self) -> &Arc<T> {
82        &self.handler
83    }
84
85    /// Get handler metadata
86    #[must_use]
87    pub const fn metadata(&self) -> &HandlerMetadata {
88        &self.metadata
89    }
90
91    /// Update handler metadata
92    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}