rsiot/components/cmp_esp_nvs/
config.rs

1//! Тестирование документации:
2//!
3//! Нет тестируется - Exec format error (os error 8)
4//!
5//! ```bash
6//! cargo test components::cmp_storage_esp --features="cmp_storage_esp, single-thread" --target="riscv32imc-esp-espidf";
7//! ```
8
9use serde::{de::DeserializeOwned, Serialize};
10
11use crate::message::{Message, MsgDataBound};
12
13/// Конфигурация cmp_storage_esp
14#[derive(Debug)]
15pub struct Config<TMsg, TStorageData>
16where
17    TMsg: MsgDataBound,
18    TStorageData: std::fmt::Debug + Default + DeserializeOwned + PartialEq + Serialize,
19{
20    /// Функция для сохранения информации из входных сообщений в памяти ESP.
21    ///
22    /// # Примеры
23    ///
24    /// ```rust
25    /// use rsiot::message::{example_message::*, *};
26    /// use serde::Deserialize;
27    ///
28    /// #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
29    /// struct StorageData {
30    ///     pub test_f64: f64,
31    ///     pub test_i32: i32,
32    /// }
33    ///
34    /// let _ = Config {
35    ///     fn_input: |data: &StorageData, msg: &Message<Custom>| match msg.data {
36    ///         MsgData::Custom(Custom::ValueInstantF64(value)) => Some(StorageData {
37    ///             test_f64: value,
38    ///             ..*data
39    ///         }),
40    ///         _ => None,
41    ///     },
42    ///     fn_output: |_| vec![],
43    /// };
44    ///
45    /// ```
46    pub fn_input: fn(&TStorageData, &Message<TMsg>) -> Option<TStorageData>,
47
48    /// Функция для выдачи сообщений из сохраненных данных.
49    ///
50    /// Вызывается один раз, при запуске ESP.
51    ///
52    /// # Примеры
53    ///
54    /// ```rust
55    /// use rsiot::message::{example_message::*, *};
56    /// use serde::{Deserialize, Serialize};
57    ///
58    /// #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
59    /// struct StorageData {
60    ///     pub test_f64: f64,
61    ///     pub test_i32: i32,
62    /// }
63    ///
64    /// let _ = Config {
65    ///     fn_input: |_, _| None,
66    ///     fn_output: |data: &StorageData| {
67    ///         vec![Message::new(MsgData::Custom(Custom::ValueInstantF64(
68    ///             data.test_f64,
69    ///         )))]
70    ///     },
71    /// };
72    /// ```
73    pub fn_output: fn(&TStorageData) -> Vec<Message<TMsg>>,
74}
75
76#[cfg(test)]
77mod tests {
78
79    use super::Config;
80
81    #[test]
82    fn fn_input() {
83        use crate::message::{example_message::*, *};
84        use serde::{Deserialize, Serialize};
85
86        #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
87        struct StorageData {
88            pub test_f64: f64,
89            pub test_i32: i32,
90        }
91
92        let _ = Config {
93            fn_input: |data: &StorageData, msg: &Message<Custom>| match msg.data {
94                MsgData::Custom(Custom::ValueInstantF64(value)) => Some(StorageData {
95                    test_f64: value,
96                    ..*data
97                }),
98                _ => None,
99            },
100            fn_output: |_| vec![],
101        };
102    }
103
104    #[test]
105    fn fn_output() {
106        use crate::message::{example_message::*, *};
107        use serde::{Deserialize, Serialize};
108
109        #[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
110        struct StorageData {
111            pub test_f64: f64,
112            pub test_i32: i32,
113        }
114
115        let _ = Config {
116            fn_input: |_, _| None,
117            fn_output: |data: &StorageData| {
118                vec![Message::new(MsgData::Custom(Custom::ValueInstantF64(
119                    data.test_f64,
120                )))]
121            },
122        };
123    }
124}