rsiot/components/cmp_derive/
derive_item.rs1use crate::message::{Message, MsgDataBound};
2
3use super::derive_item_process::DeriveItemProcess;
4
5pub struct DeriveItem<TMsg, TStore>
7where
8 TStore: Default + Send + Sync,
9{
10 pub store: TStore,
12
13 pub fn_input: fn(msg: &Message<TMsg>, store: &mut TStore) -> (),
15
16 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}