node/ledger/read/
ledger_read_actions.rs

1use serde::{Deserialize, Serialize};
2
3use super::{
4    LedgerReadId, LedgerReadInitCallback, LedgerReadRequest, LedgerReadRequestState,
5    LedgerReadResponse,
6};
7
8pub type LedgerReadActionWithMetaRef<'a> = redux::ActionWithMeta<&'a LedgerReadAction>;
9
10#[derive(Serialize, Deserialize, Debug, Clone)]
11pub enum LedgerReadAction {
12    FindTodos,
13    Init {
14        request: LedgerReadRequest,
15        callback: LedgerReadInitCallback,
16    },
17    Pending {
18        id: LedgerReadId,
19        request: LedgerReadRequest,
20    },
21    Success {
22        id: LedgerReadId,
23        response: LedgerReadResponse,
24    },
25    Prune {
26        id: LedgerReadId,
27    },
28}
29
30impl redux::EnablingCondition<crate::State> for LedgerReadAction {
31    fn is_enabled(&self, state: &crate::State, _time: redux::Timestamp) -> bool {
32        match self {
33            LedgerReadAction::FindTodos => state.ledger.read.is_total_cost_under_limit(),
34            LedgerReadAction::Init { .. } => state.ledger.read.is_total_cost_under_limit(),
35            LedgerReadAction::Pending { id, .. } => {
36                state.ledger.read.is_total_cost_under_limit()
37                    && !state.ledger.read.contains(*id)
38                    && state.ledger.read.next_req_id() == *id
39            }
40            LedgerReadAction::Success { id, response } => match &state.ledger.read.get(*id) {
41                Some(LedgerReadRequestState::Pending { request, .. }) => {
42                    request.kind() == response.kind()
43                }
44                _ => false,
45            },
46            LedgerReadAction::Prune { id } => matches!(
47                state.ledger.read.get(*id),
48                Some(LedgerReadRequestState::Success { .. })
49            ),
50        }
51    }
52}
53
54impl From<LedgerReadAction> for crate::Action {
55    fn from(value: LedgerReadAction) -> Self {
56        Self::Ledger(value.into())
57    }
58}