rabbitmesh_gateway/
registry.rs

1use std::collections::HashMap;
2use tokio::sync::RwLock;
3use serde::{Serialize, Deserialize};
4
5/// Service registry for tracking available services and their methods
6#[derive(Debug)]
7pub struct ServiceRegistry {
8    services: RwLock<HashMap<String, ServiceInfo>>,
9}
10
11/// Information about a registered service
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct ServiceInfo {
14    pub name: String,
15    pub methods: Vec<MethodInfo>,
16    pub version: Option<String>,
17    pub description: Option<String>,
18}
19
20/// Information about a service method
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct MethodInfo {
23    pub name: String,
24    pub http_route: Option<String>,
25    pub description: Option<String>,
26    pub parameters: Vec<ParameterInfo>,
27    pub return_type: Option<String>,
28}
29
30/// Parameter information for a method
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct ParameterInfo {
33    pub name: String,
34    pub param_type: String,
35    pub required: bool,
36    pub description: Option<String>,
37}
38
39impl ServiceRegistry {
40    /// Create new service registry
41    pub fn new() -> Self {
42        Self {
43            services: RwLock::new(HashMap::new()),
44        }
45    }
46
47    /// Register a service
48    pub async fn register_service(&self, service_info: ServiceInfo) {
49        let mut services = self.services.write().await;
50        services.insert(service_info.name.clone(), service_info);
51    }
52
53    /// Get service information
54    pub async fn get_service(&self, name: &str) -> Option<ServiceInfo> {
55        let services = self.services.read().await;
56        services.get(name).cloned()
57    }
58
59    /// List all registered services
60    pub async fn list_services(&self) -> Vec<String> {
61        let services = self.services.read().await;
62        services.keys().cloned().collect()
63    }
64
65    /// Remove a service
66    pub async fn unregister_service(&self, name: &str) {
67        let mut services = self.services.write().await;
68        services.remove(name);
69    }
70}
71
72impl Default for ServiceRegistry {
73    fn default() -> Self {
74        Self::new()
75    }
76}