rillrate_protocol/base/meta_flow/
state.rs

1use rill_protocol::flow::core::{DataFraction, Flow};
2use rill_protocol::io::provider::{Path, StreamType};
3use serde::{Deserialize, Serialize};
4
5// TODO: Use list instead?
6pub trait MetaFlowSpec: DataFraction {
7    type Meta: DataFraction;
8
9    fn path() -> Path;
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct MetaFlowState<T: MetaFlowSpec> {
14    pub meta: Option<T::Meta>,
15}
16
17#[allow(clippy::new_without_default)]
18impl<T: MetaFlowSpec> MetaFlowState<T> {
19    pub fn new() -> Self {
20        Self { meta: None }
21    }
22}
23
24impl<T: MetaFlowSpec> Flow for MetaFlowState<T> {
25    type Action = MetaFlowAction;
26    type Event = MetaFlowEvent<T>;
27
28    fn stream_type() -> StreamType {
29        StreamType::from(module_path!())
30    }
31
32    fn apply(&mut self, event: Self::Event) {
33        match event {
34            MetaFlowEvent::SetMeta { meta } => {
35                self.meta = Some(meta);
36            }
37            MetaFlowEvent::Clear => {
38                self.meta.take();
39            }
40        }
41    }
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub enum MetaFlowAction {}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub enum MetaFlowEvent<T: MetaFlowSpec> {
49    SetMeta { meta: T::Meta },
50    Clear,
51}