node/ledger/read/
ledger_read_actions.rs1use 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}