node/transition_frontier/sync/ledger/
transition_frontier_sync_ledger_reducer.rs

1use crate::Substate;
2
3use super::{
4    snarked::{
5        TransitionFrontierSyncLedgerSnarkedAction, TransitionFrontierSyncLedgerSnarkedState,
6    },
7    staged::{TransitionFrontierSyncLedgerStagedAction, TransitionFrontierSyncLedgerStagedState},
8    TransitionFrontierSyncLedgerAction, TransitionFrontierSyncLedgerActionWithMetaRef,
9    TransitionFrontierSyncLedgerState,
10};
11
12impl TransitionFrontierSyncLedgerState {
13    pub fn reducer(
14        mut state_context: crate::Substate<Self>,
15        action: TransitionFrontierSyncLedgerActionWithMetaRef<'_>,
16    ) {
17        let Ok(state) = state_context.get_substate_mut() else {
18            // TODO: log or propagate
19            return;
20        };
21        let (action, meta) = action.split();
22
23        match action {
24            TransitionFrontierSyncLedgerAction::Init => {}
25            TransitionFrontierSyncLedgerAction::Snarked(action) => {
26                if let TransitionFrontierSyncLedgerSnarkedAction::Pending = action {
27                    let Self::Init { target, .. } = state else {
28                        return;
29                    };
30                    let s = TransitionFrontierSyncLedgerSnarkedState::pending(
31                        meta.time(),
32                        target.clone(),
33                    );
34                    *state = Self::Snarked(s);
35                } else {
36                    if state.snarked().is_none() {
37                        return;
38                    };
39                    TransitionFrontierSyncLedgerSnarkedState::reducer(
40                        Substate::from_compatible_substate(state_context),
41                        meta.with_action(action),
42                    );
43                }
44            }
45            TransitionFrontierSyncLedgerAction::Staged(
46                TransitionFrontierSyncLedgerStagedAction::PartsFetchPending,
47            ) => {
48                let Self::Snarked(TransitionFrontierSyncLedgerSnarkedState::Success {
49                    target, ..
50                }) = state
51                else {
52                    return;
53                };
54                let s = TransitionFrontierSyncLedgerStagedState::pending(
55                    meta.time(),
56                    target.clone().with_staged().unwrap(),
57                );
58                *state = Self::Staged(s);
59            }
60            TransitionFrontierSyncLedgerAction::Staged(action) => match state {
61                Self::Snarked(TransitionFrontierSyncLedgerSnarkedState::Success {
62                    target, ..
63                }) if matches!(
64                    action,
65                    TransitionFrontierSyncLedgerStagedAction::ReconstructEmpty
66                ) =>
67                {
68                    let s = TransitionFrontierSyncLedgerStagedState::ReconstructEmpty {
69                        time: meta.time(),
70                        target: target.clone().with_staged().unwrap(),
71                    };
72                    *state = Self::Staged(s);
73                }
74                Self::Staged(_) => TransitionFrontierSyncLedgerStagedState::reducer(
75                    Substate::from_compatible_substate(state_context),
76                    meta.with_action(action),
77                ),
78                _ => (),
79            },
80            TransitionFrontierSyncLedgerAction::Success => {
81                match state {
82                    Self::Staged(TransitionFrontierSyncLedgerStagedState::Success {
83                        target,
84                        needed_protocol_states,
85                        ..
86                    }) => {
87                        *state = Self::Success {
88                            time: meta.time(),
89                            target: target.clone().into(),
90                            needed_protocol_states: std::mem::take(needed_protocol_states),
91                        };
92                    }
93                    Self::Snarked(TransitionFrontierSyncLedgerSnarkedState::Success {
94                        target,
95                        ..
96                    }) => {
97                        *state = Self::Success {
98                            time: meta.time(),
99                            target: target.clone(),
100                            // No additional protocol states needed for snarked ledger.
101                            needed_protocol_states: Default::default(),
102                        };
103                    }
104                    _ => {}
105                }
106            }
107        }
108    }
109}