diff --git a/src/telemetry.rs b/src/telemetry.rs index 79c1ddf..3cba9ed 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -4,6 +4,20 @@ use uuid::Uuid; use crate::model::ScanMode; +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum ValueType { + Null, + Bool, + Int, + UInt, + Float, + Text, + Bytes, + Array, + Object, +} + #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum PointQuality { @@ -69,7 +83,7 @@ pub struct PointMonitorInfo { pub timestamp: Option>, pub quality: PointQuality, pub value: Option, - pub value_type: Option, + pub value_type: Option, pub value_text: Option, } @@ -85,7 +99,7 @@ pub struct PointValueChangeEvent { pub point_id: Option, pub client_handle: u32, pub value: Option, - pub value_type: Option, + pub value_type: Option, pub value_text: Option, pub quality: PointQuality, pub protocol: String, @@ -101,7 +115,7 @@ pub struct WsPointMonitorInfo { pub timestamp: Option, pub quality: PointQuality, pub value: Option, - pub value_type: Option, + pub value_type: Option, } impl From<&PointMonitorInfo> for WsPointMonitorInfo { @@ -146,9 +160,17 @@ pub fn opcua_variant_to_data(value: &opcua::types::Variant) -> DataValue { } } -pub fn opcua_variant_type(value: &opcua::types::Variant) -> String { - match value.scalar_type_id() { - Some(t) => t.to_string(), - None => "unknown".to_string(), +pub fn opcua_variant_type(value: &opcua::types::Variant) -> ValueType { + use opcua::types::Variant; + match value { + Variant::Empty => ValueType::Null, + Variant::Boolean(_) => ValueType::Bool, + Variant::SByte(_) | Variant::Int16(_) | Variant::Int32(_) | Variant::Int64(_) => ValueType::Int, + Variant::Byte(_) | Variant::UInt16(_) | Variant::UInt32(_) | Variant::UInt64(_) => ValueType::UInt, + Variant::Float(_) | Variant::Double(_) => ValueType::Float, + Variant::String(_) => ValueType::Text, + Variant::ByteString(_) => ValueType::Bytes, + Variant::Array(_) => ValueType::Array, + _ => ValueType::Text, } }