Skip to main content

subtr_actor/stats/analysis_graph/nodes/
ball_half.rs

1use super::*;
2use crate::stats::calculators::*;
3use crate::*;
4
5pub struct BallHalfNode {
6    calculator: BallHalfCalculator,
7}
8
9impl BallHalfNode {
10    pub fn new() -> Self {
11        Self::with_config(BallHalfCalculatorConfig::default())
12    }
13
14    pub fn with_config(config: BallHalfCalculatorConfig) -> Self {
15        Self {
16            calculator: BallHalfCalculator::with_config(config),
17        }
18    }
19}
20
21impl Default for BallHalfNode {
22    fn default() -> Self {
23        Self::new()
24    }
25}
26
27impl AnalysisNode for BallHalfNode {
28    type State = BallHalfCalculator;
29
30    fn name(&self) -> &'static str {
31        "ball_half"
32    }
33
34    fn dependencies(&self) -> NodeDependencies {
35        vec![
36            frame_info_dependency(),
37            ball_frame_state_dependency(),
38            live_play_dependency(),
39        ]
40    }
41
42    fn evaluate(&mut self, ctx: &AnalysisStateContext<'_>) -> SubtrActorResult<()> {
43        self.calculator.update(
44            ctx.get::<FrameInfo>()?,
45            ctx.get::<BallFrameState>()?,
46            ctx.get::<LivePlayState>()?,
47        )
48    }
49
50    fn finish(&mut self, _ctx: &AnalysisStateContext<'_>) -> SubtrActorResult<()> {
51        self.calculator.flush_pending_event();
52        Ok(())
53    }
54
55    fn state(&self) -> &Self::State {
56        &self.calculator
57    }
58}
59
60pub(crate) fn boxed_default() -> Box<dyn AnalysisNodeDyn> {
61    Box::new(BallHalfNode::new())
62}