diff options
author | Albin Suresh <albin.suresh@softwareag.com> | 2021-12-22 15:02:24 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-22 15:02:24 +0530 |
commit | 0d61811849ce9931b91b65a7e94865d99f4bb394 (patch) | |
tree | 5b6e2b4d3d44be2f1256842fb4b9d16c9e7ca2df /crates/core/tedge_mapper | |
parent | 888a4e70ca44d9b41d645148b7a24d89a984da7c (diff) |
Closes #667 Thin Edge JSON alarm support (#726)
* Closes #667 Thin Edge JSON alarm support
Diffstat (limited to 'crates/core/tedge_mapper')
-rw-r--r-- | crates/core/tedge_mapper/src/c8y_converter.rs | 52 | ||||
-rw-r--r-- | crates/core/tedge_mapper/src/error.rs | 6 |
2 files changed, 46 insertions, 12 deletions
diff --git a/crates/core/tedge_mapper/src/c8y_converter.rs b/crates/core/tedge_mapper/src/c8y_converter.rs index 23d6020f..6fb9997a 100644 --- a/crates/core/tedge_mapper/src/c8y_converter.rs +++ b/crates/core/tedge_mapper/src/c8y_converter.rs @@ -1,10 +1,12 @@ use crate::error::*; use crate::size_threshold::SizeThreshold; use crate::{converter::*, operations::Operations}; +use c8y_smartrest::alarm; use c8y_smartrest::smartrest_serializer::{SmartRestSerializer, SmartRestSetSupportedOperations}; use c8y_translator::json; use mqtt_client::{Message, Topic}; use std::collections::HashSet; +use thin_edge_json::alarm::ThinEdgeAlarm; const SMARTREST_PUBLISH_TOPIC: &str = "c8y/s/us"; @@ -19,7 +21,10 @@ impl CumulocityConverter { let mut topic_fiter = make_valid_topic_filter_or_panic("tedge/measurements"); let () = topic_fiter .add("tedge/measurements/+") - .expect("invalid topic filter"); + .expect("invalid measurement topic filter"); + let () = topic_fiter + .add("tedge/alarms/+/+") + .expect("invalid alarm topic filter"); let mapper_config = MapperConfig { in_topic_filter: topic_fiter, @@ -34,18 +39,11 @@ impl CumulocityConverter { mapper_config, } } -} - -impl Converter for CumulocityConverter { - type Error = ConversionError; - - fn get_mapper_config(&self) -> &MapperConfig { - &self.mapper_config - } - - fn try_convert(&mut self, input: &Message) -> Result<Vec<Message>, ConversionError> { - let () = self.size_threshold.validate(input.payload_str()?)?; + fn try_convert_measurement( + &mut self, + input: &Message, + ) -> Result<Vec<Message>, ConversionError> { let mut vec: Vec<Message> = Vec::new(); let maybe_child_id = get_child_id_from_topic(&input.topic.name)?; @@ -79,6 +77,36 @@ impl Converter for CumulocityConverter { Ok(vec) } + fn try_convert_alarm(&self, input: &Message) -> Result<Vec<Message>, ConversionError> { + let c8y_alarm_topic = Topic::new_unchecked(SMARTREST_PUBLISH_TOPIC); + let mut vec: Vec<Message> = Vec::new(); + + let tedge_alarm = ThinEdgeAlarm::try_from(input.topic.name.as_str(), input.payload_str()?)?; + let smartrest_alarm = alarm::serialize_alarm(tedge_alarm)?; + vec.push(Message::new(&c8y_alarm_topic, smartrest_alarm)); + + Ok(vec) + } +} + +impl Converter for CumulocityConverter { + type Error = ConversionError; + + fn get_mapper_config(&self) -> &MapperConfig { + &self.mapper_config + } + + fn try_convert(&mut self, input: &Message) -> Result<Vec<Message>, ConversionError> { + let () = self.size_threshold.validate(input.payload_str()?)?; + if input.topic.name.starts_with("tedge/measurement") { + self.try_convert_measurement(input) + } else if input.topic.name.starts_with("tedge/alarms") { + self.try_convert_alarm(input) + } else { + return Err(ConversionError::UnsupportedTopic(input.topic.name.clone())); + } + } + fn try_init_messages(&self) -> Result<Vec<Message>, ConversionError> { let ops = Operations::try_new("/etc/tedge/operations")?; let ops = ops.get_operations_list("c8y"); diff --git a/crates/core/tedge_mapper/src/error.rs b/crates/core/tedge_mapper/src/error.rs index 21ec16df..b1aa90b5 100644 --- a/crates/core/tedge_mapper/src/error.rs +++ b/crates/core/tedge_mapper/src/error.rs @@ -33,6 +33,9 @@ pub enum ConversionError { FromThinEdgeJsonSerialization(#[from] ThinEdgeJsonSerializationError), #[error(transparent)] + FromThinEdgeJsonDeserialization(#[from] thin_edge_json::alarm::ThinEdgeJsonDeserializerError), + + #[error(transparent)] FromThinEdgeJsonParser(#[from] thin_edge_json::parser::ThinEdgeJsonParserError), #[error(transparent)] @@ -49,6 +52,9 @@ pub enum ConversionError { #[error(transparent)] FromSmartRestSerializerError(#[from] c8y_smartrest::error::SmartRestSerializerError), + + #[error("Unsupported topic: {0}")] + UnsupportedTopic(String), } #[derive(Debug, thiserror::Error)] |