Skip to main content

zelos_trace_types/
signal.rs

1use std::collections::HashMap;
2
3#[cfg(feature = "duckdb")]
4use anyhow::{Result, anyhow};
5#[cfg(feature = "duckdb")]
6use duckdb::Row;
7use serde::Serialize;
8use serde_json::Number;
9#[cfg(feature = "ts-rs")]
10use ts_rs::TS;
11use uuid::Uuid;
12
13use crate::{DataType, SignalKey};
14
15#[cfg(feature = "duckdb")]
16fn parse_uuid_from_db(value: duckdb::types::Value) -> Result<Uuid> {
17    match value {
18        duckdb::types::Value::Text(s) => {
19            Uuid::parse_str(&s).map_err(|_| anyhow!("Could not parse UUID"))
20        }
21        _ => return Err(anyhow!("Could not get UUID")),
22    }
23}
24
25#[derive(Clone, Debug, Serialize)]
26#[cfg_attr(feature = "ts-rs", derive(TS))]
27pub struct Signal {
28    pub data_segment_id: Uuid,
29    pub source: String,
30    pub message: String,
31    pub signal: String,
32    pub data_type: DataType,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub unit: Option<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub value_table: Option<HashMap<Number, String>>,
37}
38
39impl Signal {
40    pub fn key(&self) -> SignalKey {
41        SignalKey {
42            data_segment_id: crate::PathSegment::Uuid {
43                uuid: self.data_segment_id,
44            },
45            source: self.source.clone(),
46            message: self.message.clone(),
47            signal: self.signal.clone(),
48        }
49    }
50
51    pub fn key_string(&self) -> String {
52        format!(
53            "{}/{}/{}.{}",
54            self.data_segment_id, self.source, self.message, self.signal
55        )
56    }
57
58    pub fn fully_qualified_table_name(&self) -> String {
59        format!(
60            r#""{}"."{}/{}""#,
61            self.data_segment_id, self.source, self.message
62        )
63    }
64
65    #[cfg(feature = "duckdb")]
66    pub fn from_row(row: &Row, value_table: Option<&HashMap<Number, String>>) -> Result<Signal> {
67        Ok(Signal {
68            data_segment_id: parse_uuid_from_db(row.get("data_segment_id")?)?,
69            source: row.get("source")?,
70            message: row.get("message")?,
71            signal: row.get("signal")?,
72            unit: row.get("unit")?,
73            data_type: row
74                .get::<&str, String>("data_type")
75                .map_err(|e| e.into())
76                .and_then(|s| DataType::from_duckdb_type(&s))?,
77            value_table: value_table.cloned(),
78        })
79    }
80}