Skip to main content

middleware_core/discovery/
query.rs

1use 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}