rsiot/components/cmp_esp_nvs/
config.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
120
121
122
123
124
//! Тестирование документации:
//!
//! Нет тестируется - Exec format error (os error 8)
//!
//! ```bash
//! cargo test components::cmp_storage_esp --features="cmp_storage_esp, single-thread" --target="riscv32imc-esp-espidf";
//! ```

use serde::{de::DeserializeOwned, Serialize};

use crate::message::{Message, MsgDataBound};

/// Конфигурация cmp_storage_esp
#[derive(Debug)]
pub struct Config<TMsg, TStorageData>
where
    TMsg: MsgDataBound,
    TStorageData: std::fmt::Debug + Default + DeserializeOwned + PartialEq + Serialize,
{
    /// Функция для сохранения информации из входных сообщений в памяти ESP.
    ///
    /// # Примеры
    ///
    /// ```rust
    /// use rsiot::message::{example_message::*, *};
    /// use serde::Deserialize;
    ///
    /// #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
    /// struct StorageData {
    ///     pub test_f64: f64,
    ///     pub test_i32: i32,
    /// }
    ///
    /// let _ = Config {
    ///     fn_input: |data: &StorageData, msg: &Message<Custom>| match msg.data {
    ///         MsgData::Custom(Custom::ValueInstantF64(value)) => Some(StorageData {
    ///             test_f64: value,
    ///             ..*data
    ///         }),
    ///         _ => None,
    ///     },
    ///     fn_output: |_| vec![],
    /// };
    ///
    /// ```
    pub fn_input: fn(&TStorageData, &Message<TMsg>) -> Option<TStorageData>,

    /// Функция для выдачи сообщений из сохраненных данных.
    ///
    /// Вызывается один раз, при запуске ESP.
    ///
    /// # Примеры
    ///
    /// ```rust
    /// use rsiot::message::{example_message::*, *};
    /// use serde::{Deserialize, Serialize};
    ///
    /// #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
    /// struct StorageData {
    ///     pub test_f64: f64,
    ///     pub test_i32: i32,
    /// }
    ///
    /// let _ = Config {
    ///     fn_input: |_, _| None,
    ///     fn_output: |data: &StorageData| {
    ///         vec![Message::new(MsgData::Custom(Custom::ValueInstantF64(
    ///             data.test_f64,
    ///         )))]
    ///     },
    /// };
    /// ```
    pub fn_output: fn(&TStorageData) -> Vec<Message<TMsg>>,
}

#[cfg(test)]
mod tests {

    use super::Config;

    #[test]
    fn fn_input() {
        use crate::message::{example_message::*, *};
        use serde::{Deserialize, Serialize};

        #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
        struct StorageData {
            pub test_f64: f64,
            pub test_i32: i32,
        }

        let _ = Config {
            fn_input: |data: &StorageData, msg: &Message<Custom>| match msg.data {
                MsgData::Custom(Custom::ValueInstantF64(value)) => Some(StorageData {
                    test_f64: value,
                    ..*data
                }),
                _ => None,
            },
            fn_output: |_| vec![],
        };
    }

    #[test]
    fn fn_output() {
        use crate::message::{example_message::*, *};
        use serde::{Deserialize, Serialize};

        #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
        struct StorageData {
            pub test_f64: f64,
            pub test_i32: i32,
        }

        let _ = Config {
            fn_input: |_, _| None,
            fn_output: |data: &StorageData| {
                vec![Message::new(MsgData::Custom(Custom::ValueInstantF64(
                    data.test_f64,
                )))]
            },
        };
    }
}