rsiot/components/cmp_derive/
derive_item.rs

1use crate::message::{Message, MsgDataBound};
2
3use super::derive_item_process::DeriveItemProcess;
4
5/// Хранение данных для преобразования
6pub struct DeriveItem<TMsg, TStore>
7where
8    TStore: Default + Send + Sync,
9{
10    /// Структура для сохранения промежуточных данных из входящих сообщений
11    pub store: TStore,
12
13    /// Обработка входящих сообщений и сохранение в `store`
14    pub fn_input: fn(msg: &Message<TMsg>, store: &mut TStore) -> (),
15
16    /// Формирование исходящих сообщений на основе данных, сохраненных в `store`
17    pub fn_output: fn(store: &TStore) -> Option<Vec<Message<TMsg>>>,
18}
19
20impl<TMsg, TStore> DeriveItemProcess<TMsg> for DeriveItem<TMsg, TStore>
21where
22    TMsg: MsgDataBound,
23    TStore: Clone + Default + PartialEq + Send + Sync,
24{
25    fn process(&mut self, msg: &Message<TMsg>) -> Option<Vec<Message<TMsg>>> {
26        let old_store = self.store.clone();
27
28        (self.fn_input)(msg, &mut self.store);
29        if old_store == self.store {
30            return None;
31        }
32        let msgs_content_data = (self.fn_output)(&self.store)?;
33        Some(msgs_content_data)
34    }
35}