zelos_trace_types/
signal.rs1use 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}