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}