Skip to main content

zelos_trace_types/
signal_key.rs

1use anyhow::{Result, anyhow};
2use lazy_regex::regex;
3use uuid::Uuid;
4
5use super::Signal;
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
8pub enum PathSegment {
9    Wildcard,
10    Uuid { uuid: Uuid },
11}
12
13/// A signal key that uniquely identifies a signal
14#[derive(Debug, Clone, PartialEq, Eq, Hash)]
15pub struct SignalKey {
16    pub data_segment_id: PathSegment,
17    pub source: String,
18    pub message: String,
19    pub signal: String,
20}
21
22impl SignalKey {
23    pub fn try_parse(value: &str) -> Result<SignalKey> {
24        // Split all signals into their component parts
25        let r = regex!(r#"^([\*\w-]+)/([^/\.]+)/([^\.]+)\.(.+)$"#);
26        let parsed = r
27            .captures(value)
28            .ok_or_else(|| anyhow!("Could not parse signal key: {}", value))?;
29
30        // Map the data_segment id to either some UUID or none
31        let data_segment_id = match &parsed[1] {
32            "*" => PathSegment::Wildcard,
33            uuid => PathSegment::Uuid {
34                uuid: Uuid::parse_str(uuid)?,
35            },
36        };
37        Ok(SignalKey {
38            data_segment_id,
39            source: parsed[2].to_string(),
40            message: parsed[3].to_string(),
41            signal: parsed[4].to_string(),
42        })
43    }
44
45    pub fn matches(&self, signal: &Signal) -> bool {
46        let data_segment_id_matches = match self.data_segment_id {
47            PathSegment::Wildcard => true,
48            PathSegment::Uuid { uuid } => uuid == signal.data_segment_id,
49        };
50
51        data_segment_id_matches
52            && self.source == signal.source
53            && self.message == signal.message
54            && self.signal == signal.signal
55    }
56}