zelos_trace_types/
signal_key.rs1use 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#[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 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 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}