rsiot/message/
example_message.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//! Пример реализации сообщения. Можно использовать для тестирования компонентов

use super::{
    example_service::Service, Deserialize, MsgDataBound, MsgRoute, Serialize, TimeToLiveValue,
};

/// Пример реализации сообщения. Можно использовать для тестирования компонентов
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[allow(missing_docs)]
pub enum Custom {
    /// Мгновенное значение типа f64
    ValueInstantF64(f64),
    /// Мгновенное значение типа bool
    ValueInstantBool(bool),
    /// Мгновенное значение типа String
    ValueInstantString(String),
    /// Значение типа unit
    DataUnit(()),
    /// Вложенная группа
    DataGroup(DataGroup),
    /// Вложенный кортеж
    Tuple((String, (bool, bool))),
    /// ValueStruct
    ValueStruct {
        a: f64,
    },
    /// ESP - кнопка BOOT
    EspBootButton(bool),
    /// ESP - выход на реле
    EspRelay(bool),
    MotorM1(Motor),
    MotorM2(Motor),
    SaveToFilesystem(u64),
}

/// Пример структуры
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct StructInDataGroup {
    /// Поле 1
    pub struct_field1: bool,
    /// Поле 2
    pub struct_field2: f64,
}

/// Вложенная группа
#[allow(missing_docs)]
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub enum DataGroup {
    /// Значение типа f64 в структуре
    DataGroupF64(f64),
    /// Вложенная в группу структура
    DataGroupStruct(StructInDataGroup),
    DataGroupVectorBool(Vec<bool>),
    DataGroupVectorTuple(Vec<(bool, String)>),
}

/// Пример типовой структуры
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[allow(missing_docs)]
pub enum Motor {
    Status1(bool),
    Status2(bool),
    Status3(bool),
    Status4(bool),
}

impl MsgDataBound for Custom {
    type TService = Service;

    fn define_enabled_routes(&self) -> MsgRoute<Self::TService> {
        MsgRoute::default()
    }

    fn define_time_to_live(&self) -> TimeToLiveValue {
        TimeToLiveValue::Infinite
    }
}

#[cfg(test)]
mod tests {
    use super::super::Message;
    use super::*;

    #[test]
    fn test1() {
        let _msg = Custom::ValueInstantF64(12.3456);
    }

    /// Запуск:
    ///
    /// ```bash
    /// cargo test --target="x86_64-unknown-linux-gnu" -- message::example_message::tests
    /// ```
    #[test]
    fn test_key() {
        let msg = Message::new_custom(Custom::DataUnit(()));
        assert_eq!("Custom-DataUnit", msg.key);

        let msg = Message::new_custom(Custom::ValueInstantF64(0.0));
        assert_eq!("Custom-ValueInstantF64", msg.key);

        let msg = Message::new_custom(Custom::DataGroup(DataGroup::DataGroupF64(0.0)));
        assert_eq!("Custom-DataGroup-DataGroupF64", msg.key);

        let msg = Message::new_custom(Custom::DataGroup(DataGroup::DataGroupStruct(
            StructInDataGroup {
                struct_field1: false,
                struct_field2: 0.0,
            },
        )));
        assert_eq!("Custom-DataGroup-DataGroupStruct", msg.key);

        let msg = Message::new_custom(Custom::MotorM1(Motor::Status1(false)));
        assert_eq!("Custom-MotorM1-Status1", msg.key);

        let msg = Message::new_custom(Custom::MotorM2(Motor::Status1(false)));
        assert_eq!("Custom-MotorM2-Status1", msg.key);
    }
}