rillrate_protocol/base/stat_flow/
state.rs

1use rill_protocol::flow::core::{DataFraction, Flow};
2use rill_protocol::io::provider::StreamType;
3use serde::{Deserialize, Serialize};
4use std::time::Duration;
5
6/// It's like meta, but uses pulling for handling intensive load.
7pub trait StatFlowSpec: DataFraction {
8    type Stat: DataFraction + Default;
9    type Delta: DataFraction;
10
11    fn interval(&self) -> Option<Duration>;
12
13    fn apply(stat: &mut Self::Stat, delta: Self::Delta);
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct StatFlowState<T: StatFlowSpec> {
18    pub stat: T::Stat,
19}
20
21#[allow(clippy::new_without_default)]
22impl<T: StatFlowSpec> StatFlowState<T> {
23    pub fn new() -> Self {
24        Self {
25            stat: T::Stat::default(),
26        }
27    }
28}
29
30impl<T: StatFlowSpec> Flow for StatFlowState<T> {
31    type Action = StatFlowAction;
32    type Event = StatFlowEvent<T>;
33
34    fn stream_type() -> StreamType {
35        StreamType::from(module_path!())
36    }
37
38    fn apply(&mut self, event: Self::Event) {
39        match event {
40            StatFlowEvent::ApplyDelta { delta } => {
41                T::apply(&mut self.stat, delta);
42            }
43        }
44    }
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub enum StatFlowAction {}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub enum StatFlowEvent<T: StatFlowSpec> {
52    ApplyDelta { delta: T::Delta },
53}