node/transition_frontier/sync/ledger/
transition_frontier_sync_ledger_reducer.rs1use 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 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 needed_protocol_states: Default::default(),
102 };
103 }
104 _ => {}
105 }
106 }
107 }
108 }
109}