rsiot_extra_components/cmp_derive/
derive_item.rs1use 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 pub store: TStore,
11
12 pub fn_input: fn(msg: &Message<TMsg>, store: &mut TStore) -> (),
14
15 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 Some(msgs_content_data)
34 }
35}
36
37