p2p/network/pnet/
p2p_network_pnet_actions.rs

1use crate::{ConnectionAddr, Data, P2pState};
2use openmina_core::ActionEvent;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Debug, Clone, ActionEvent)]
6#[action_event(fields(display(addr), debug(data), incoming), level = trace)]
7pub enum P2pNetworkPnetAction {
8    IncomingData {
9        addr: ConnectionAddr,
10        data: Data,
11    },
12    OutgoingData {
13        addr: ConnectionAddr,
14        data: Data,
15    },
16    #[action_event(level = debug)]
17    SetupNonce {
18        addr: ConnectionAddr,
19        nonce: Data,
20        incoming: bool,
21    },
22    Timeout {
23        addr: ConnectionAddr,
24    },
25}
26
27impl P2pNetworkPnetAction {
28    pub fn addr(&self) -> &ConnectionAddr {
29        match self {
30            Self::IncomingData { addr, .. } => addr,
31            Self::OutgoingData { addr, .. } => addr,
32            Self::SetupNonce { addr, .. } => addr,
33            Self::Timeout { addr } => addr,
34        }
35    }
36}
37
38impl From<P2pNetworkPnetAction> for crate::P2pAction {
39    fn from(a: P2pNetworkPnetAction) -> Self {
40        Self::Network(a.into())
41    }
42}
43
44impl redux::EnablingCondition<P2pState> for P2pNetworkPnetAction {
45    fn is_enabled(&self, state: &P2pState, _time: redux::Timestamp) -> bool {
46        state
47            .network
48            .scheduler
49            .connection_state(self.addr())
50            .is_some()
51    }
52}