middleware_core/discovery/
query.rs1use std::time::Instant;
2
3use super::SimpleDiscovery;
4use super::state_helpers::is_name_active;
5use super::types::{DiscoveryEndpoint, DiscoveryEntry};
6
7impl SimpleDiscovery {
8 pub fn topic_entries(&self) -> Vec<DiscoveryEntry> {
9 let now = Instant::now();
10 let mut entries: Vec<DiscoveryEntry> = self
11 .topics
12 .iter()
13 .filter(|name| self.is_topic_active(name, now))
14 .map(|name| DiscoveryEntry {
15 name: name.clone(),
16 labels: self.labels.get(name).cloned().unwrap_or_default(),
17 })
18 .collect();
19 entries.sort_by(|a, b| a.name.cmp(&b.name));
20 entries
21 }
22
23 pub fn service_entries(&self) -> Vec<DiscoveryEntry> {
24 let now = Instant::now();
25 let mut entries: Vec<DiscoveryEntry> = self
26 .services
27 .iter()
28 .filter(|name| self.is_service_active(name, now))
29 .map(|name| DiscoveryEntry {
30 name: name.clone(),
31 labels: self.labels.get(name).cloned().unwrap_or_default(),
32 })
33 .collect();
34 entries.sort_by(|a, b| a.name.cmp(&b.name));
35 entries
36 }
37
38 pub fn mission_entries(&self) -> Vec<DiscoveryEntry> {
39 let now = Instant::now();
40 let mut entries: Vec<DiscoveryEntry> = self
41 .missions
42 .iter()
43 .filter(|name| self.is_mission_active(name, now))
44 .map(|name| DiscoveryEntry {
45 name: name.clone(),
46 labels: self.labels.get(name).cloned().unwrap_or_default(),
47 })
48 .collect();
49 entries.sort_by(|a, b| a.name.cmp(&b.name));
50 entries
51 }
52
53 pub fn find_topic(&self, name: &str) -> Option<DiscoveryEntry> {
54 if !self.is_topic_active(name, Instant::now()) {
55 return None;
56 }
57 self.topics.get(name).map(|topic| DiscoveryEntry {
58 name: topic.clone(),
59 labels: self.labels.get(topic).cloned().unwrap_or_default(),
60 })
61 }
62
63 pub fn find_endpoint(&self, name: &str) -> Option<DiscoveryEndpoint> {
64 if !self.is_endpoint_active(name, Instant::now()) {
65 return None;
66 }
67 self.endpoints.get(name).map(|endpoint| DiscoveryEndpoint {
68 name: name.to_string(),
69 endpoint: endpoint.clone(),
70 })
71 }
72
73 pub fn endpoint_entries(&self) -> Vec<DiscoveryEndpoint> {
74 let now = Instant::now();
75 let mut entries: Vec<DiscoveryEndpoint> = self
76 .endpoints
77 .iter()
78 .filter(|(name, _)| self.is_endpoint_active(name, now))
79 .map(|(name, endpoint)| DiscoveryEndpoint {
80 name: name.clone(),
81 endpoint: endpoint.clone(),
82 })
83 .collect();
84 entries.sort_by(|a, b| a.name.cmp(&b.name));
85 entries
86 }
87
88 pub(super) fn is_topic_active(&self, name: &str, now: Instant) -> bool {
89 self.topics.contains(name) && is_name_active(&self.topic_state, name, now)
90 }
91
92 pub(super) fn is_service_active(&self, name: &str, now: Instant) -> bool {
93 self.services.contains(name) && is_name_active(&self.service_state, name, now)
94 }
95
96 pub(super) fn is_mission_active(&self, name: &str, now: Instant) -> bool {
97 self.missions.contains(name) && is_name_active(&self.mission_state, name, now)
98 }
99
100 pub(super) fn is_endpoint_active(&self, name: &str, now: Instant) -> bool {
101 self.endpoints.contains_key(name) && is_name_active(&self.endpoint_state, name, now)
102 }
103
104 pub(super) fn remove_labels_if_unused(&mut self, key: &str) {
105 if self.topics.contains(key)
106 || self.services.contains(key)
107 || self.missions.contains(key)
108 || self.endpoints.contains_key(key)
109 {
110 return;
111 }
112 self.labels.remove(key);
113 }
114}