1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use std::{
collections::HashMap,
sync::{Arc, Mutex},
};
use itertools::Itertools;
use tracing::info;
use crate::{
common::url::Url,
registry::{memory_registry::MemoryNotifyListener, BoxRegistry, Registry},
StdError,
};
pub type SafeRegistry = Arc<Mutex<BoxRegistry>>;
pub type Registries = Arc<Mutex<HashMap<String, SafeRegistry>>>;
pub const DEFAULT_REGISTRY_KEY: &str = "default";
pub trait RegistriesOperation {
fn get(&self, registry_key: &str) -> SafeRegistry;
fn insert(&self, registry_key: String, registry: SafeRegistry);
fn default_registry(&self) -> SafeRegistry;
}
impl RegistriesOperation for Registries {
fn get(&self, registry_key: &str) -> SafeRegistry {
self.as_ref()
.lock()
.unwrap()
.get(registry_key)
.unwrap()
.clone()
}
fn insert(&self, registry_key: String, registry: SafeRegistry) {
self.as_ref().lock().unwrap().insert(registry_key, registry);
}
fn default_registry(&self) -> SafeRegistry {
let guard = self.as_ref().lock().unwrap();
let (_, result) = guard
.iter()
.find_or_first(|e| e.0 == DEFAULT_REGISTRY_KEY)
.unwrap()
.to_owned();
result.clone()
}
}
impl Registry for SafeRegistry {
type NotifyListener = MemoryNotifyListener;
fn register(&mut self, url: Url) -> Result<(), StdError> {
info!("register {}.", url);
self.lock().unwrap().register(url).expect("registry err.");
Ok(())
}
fn unregister(&mut self, url: Url) -> Result<(), StdError> {
self.lock().unwrap().register(url).expect("registry err.");
Ok(())
}
fn subscribe(&self, url: Url, listener: Self::NotifyListener) -> Result<(), StdError> {
self.lock().unwrap().register(url).expect("registry err.");
Ok(())
}
fn unsubscribe(&self, url: Url, listener: Self::NotifyListener) -> Result<(), StdError> {
self.lock().unwrap().register(url).expect("registry err.");
Ok(())
}
}