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 #[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 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}