rsiot/message/
example_message.rs

1//! Пример реализации сообщения. Можно использовать для тестирования компонентов
2
3use super::{Deserialize, MsgDataBound, MsgKey, Serialize, TimeToLiveValue};
4
5/// Пример реализации сообщения. Можно использовать для тестирования компонентов
6#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, MsgKey)]
7#[allow(missing_docs)]
8pub enum Custom {
9    /// Мгновенное значение типа f64
10    ValueInstantF64(f64),
11    /// Мгновенное значение типа bool
12    ValueInstantBool(bool),
13    /// Мгновенное значение типа String
14    ValueInstantString(String),
15    /// Значение типа unit
16    DataUnit(()),
17    /// Вложенная группа
18    DataGroup(DataGroup),
19    /// Вложенный кортеж
20    Tuple((String, (bool, bool))),
21    /// ValueStruct
22    ValueStruct {
23        a: f64,
24    },
25    /// ESP - кнопка BOOT
26    EspBootButton(bool),
27    /// ESP - выход на реле
28    EspRelay(bool),
29    SaveToFilesystem(u64),
30    // EmptyEnum(EmptyEnum),
31}
32
33/// Пример структуры
34#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
35pub struct StructInDataGroup {
36    /// Поле 1
37    pub struct_field1: bool,
38    /// Поле 2
39    pub struct_field2: f64,
40}
41
42/// Вложенная группа
43#[allow(missing_docs)]
44#[derive(Clone, Debug, Deserialize, PartialEq, Serialize, MsgKey)]
45pub enum DataGroup {
46    /// Значение типа f64 в структуре
47    DataGroupF64(f64),
48    /// Вложенная в группу структура
49    DataGroupStruct(StructInDataGroup),
50    DataGroupVectorBool(Vec<bool>),
51    DataGroupVectorTuple(Vec<(bool, String)>),
52}
53
54// Пустое перечисление
55//
56// TODO - появляется почему-то ошибка, хотя cargo-expand показывает корректный код
57// #[derive(Clone, Debug, Deserialize, MsgKey, PartialEq, Serialize)]
58// pub enum EmptyEnum {}
59
60impl MsgDataBound for Custom {
61    fn define_time_to_live(&self) -> TimeToLiveValue {
62        TimeToLiveValue::Infinite
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use super::super::Message;
69    use super::*;
70
71    #[test]
72    fn test1() {
73        let _msg = Custom::ValueInstantF64(12.3456);
74    }
75
76    /// Запуск:
77    ///
78    /// ```bash
79    /// cargo test --target="x86_64-unknown-linux-gnu" -- message::example_message::tests
80    /// ```
81    #[test]
82    fn test_key() {
83        let msg = Message::new_custom(Custom::DataUnit(()));
84        assert_eq!("Custom-DataUnit", msg.key);
85
86        let msg = Message::new_custom(Custom::ValueInstantF64(0.0));
87        assert_eq!("Custom-ValueInstantF64", msg.key);
88
89        let msg = Message::new_custom(Custom::DataGroup(DataGroup::DataGroupF64(0.0)));
90        assert_eq!("Custom-DataGroup-DataGroupF64", msg.key);
91
92        let msg = Message::new_custom(Custom::DataGroup(DataGroup::DataGroupStruct(
93            StructInDataGroup {
94                struct_field1: false,
95                struct_field2: 0.0,
96            },
97        )));
98        assert_eq!("Custom-DataGroup-DataGroupStruct", msg.key);
99    }
100}