summaryrefslogtreecommitdiffstats
path: root/crates/core/tedge_mapper
diff options
context:
space:
mode:
authorAlbin Suresh <albin.suresh@softwareag.com>2021-12-22 15:02:24 +0530
committerGitHub <noreply@github.com>2021-12-22 15:02:24 +0530
commit0d61811849ce9931b91b65a7e94865d99f4bb394 (patch)
tree5b6e2b4d3d44be2f1256842fb4b9d16c9e7ca2df /crates/core/tedge_mapper
parent888a4e70ca44d9b41d645148b7a24d89a984da7c (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.rs52
-rw-r--r--crates/core/tedge_mapper/src/error.rs6
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)]