rsiot_extra_components/cmp_derive/
derive_item.rs

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