subtr_actor/stats/analysis_graph/nodes/
ball_half.rs1use 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}