p2p/
p2p_actions.rs

1use openmina_macros::ActionEvent;
2use redux::EnablingCondition;
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    channels::P2pChannelsEffectfulAction, connection::P2pConnectionEffectfulAction,
7    disconnection_effectful::P2pDisconnectionEffectfulAction, P2pNetworkEffectfulAction,
8};
9
10use super::{
11    channels::P2pChannelsAction, connection::P2pConnectionAction,
12    disconnection::P2pDisconnectionAction, identify::P2pIdentifyAction, network::P2pNetworkAction,
13    peer::P2pPeerAction, P2pState,
14};
15
16#[derive(Serialize, Deserialize, Debug, Clone, derive_more::From, ActionEvent)]
17pub enum P2pAction {
18    Initialization(P2pInitializeAction),
19    Connection(P2pConnectionAction),
20    Disconnection(P2pDisconnectionAction),
21    Identify(P2pIdentifyAction),
22    Channels(P2pChannelsAction),
23    Peer(P2pPeerAction),
24    Network(P2pNetworkAction),
25}
26
27#[derive(Serialize, Deserialize, Debug, Clone, derive_more::From, ActionEvent)]
28pub enum P2pEffectfulAction {
29    Initialize,
30    Channels(P2pChannelsEffectfulAction),
31    Connection(P2pConnectionEffectfulAction),
32    Disconnection(P2pDisconnectionEffectfulAction),
33    Network(P2pNetworkEffectfulAction),
34}
35
36#[derive(Serialize, Deserialize, Debug, Clone, derive_more::From, ActionEvent)]
37#[action_event(level = info, fields(display(chain_id)))]
38pub enum P2pInitializeAction {
39    /// Initializes p2p layer.
40    #[action_event(level = info)]
41    Initialize { chain_id: openmina_core::ChainId },
42}
43
44impl EnablingCondition<P2pState> for P2pInitializeAction {
45    fn is_enabled(&self, _state: &P2pState, _time: redux::Timestamp) -> bool {
46        // this action cannot be called for initialized p2p state
47        false
48    }
49}
50
51impl redux::EnablingCondition<crate::P2pState> for P2pAction {
52    fn is_enabled(&self, state: &crate::P2pState, time: redux::Timestamp) -> bool {
53        match self {
54            P2pAction::Initialization(a) => a.is_enabled(state, time),
55            P2pAction::Connection(a) => a.is_enabled(state, time),
56            P2pAction::Disconnection(a) => a.is_enabled(state, time),
57            P2pAction::Channels(a) => a.is_enabled(state, time),
58            P2pAction::Peer(a) => a.is_enabled(state, time),
59            P2pAction::Identify(a) => a.is_enabled(state, time),
60            P2pAction::Network(a) => a.is_enabled(state, time),
61        }
62    }
63}
64
65impl redux::EnablingCondition<crate::P2pState> for P2pEffectfulAction {
66    fn is_enabled(&self, state: &crate::P2pState, time: redux::Timestamp) -> bool {
67        match self {
68            P2pEffectfulAction::Channels(a) => a.is_enabled(state, time),
69            P2pEffectfulAction::Connection(a) => a.is_enabled(state, time),
70            P2pEffectfulAction::Disconnection(a) => a.is_enabled(state, time),
71            P2pEffectfulAction::Network(a) => a.is_enabled(state, time),
72            P2pEffectfulAction::Initialize => true,
73        }
74    }
75}
76
77impl From<redux::AnyAction> for P2pAction {
78    fn from(action: redux::AnyAction) -> Self {
79        *action.0.downcast::<Self>().expect("Downcast failed")
80    }
81}
82
83impl From<redux::AnyAction> for P2pEffectfulAction {
84    fn from(action: redux::AnyAction) -> Self {
85        *action.0.downcast::<Self>().expect("Downcast failed")
86    }
87}