node/ledger/write/
ledger_write_state.rs

1use serde::{Deserialize, Serialize};
2
3use super::{LedgerWriteRequest, LedgerWriteResponse};
4
5#[derive(Serialize, Deserialize, Debug, Clone, Default)]
6pub enum LedgerWriteState {
7    #[default]
8    Idle,
9    Init {
10        time: redux::Timestamp,
11        request: LedgerWriteRequest,
12    },
13    Pending {
14        time: redux::Timestamp,
15        request: LedgerWriteRequest,
16    },
17    Success {
18        time: redux::Timestamp,
19        request: LedgerWriteRequest,
20        response: LedgerWriteResponse,
21    },
22}
23
24impl LedgerWriteState {
25    pub fn request(&self) -> Option<&LedgerWriteRequest> {
26        match self {
27            Self::Idle => None,
28            Self::Init { request, .. }
29            | Self::Pending { request, .. }
30            | Self::Success { request, .. } => Some(request),
31        }
32    }
33
34    pub fn pending_requests(
35        &self,
36    ) -> impl Iterator<Item = (&LedgerWriteRequest, redux::Timestamp)> {
37        std::iter::once(match self {
38            Self::Pending { time, request } => Some((request, *time)),
39            _ => None,
40        })
41        .flatten()
42    }
43
44    pub fn is_busy(&self) -> bool {
45        self.pending_requests().peekable().peek().is_some()
46    }
47}