rabbitmesh_gateway/
registry.rs1use std::collections::HashMap;
2use tokio::sync::RwLock;
3use serde::{Serialize, Deserialize};
4
5#[derive(Debug)]
7pub struct ServiceRegistry {
8 services: RwLock<HashMap<String, ServiceInfo>>,
9}
10
11#[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#[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#[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 pub fn new() -> Self {
42 Self {
43 services: RwLock::new(HashMap::new()),
44 }
45 }
46
47 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 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 pub async fn list_services(&self) -> Vec<String> {
61 let services = self.services.read().await;
62 services.keys().cloned().collect()
63 }
64
65 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}