use serde_derive::{Deserialize, Serialize}; use std::marker::PhantomData; use types::{Attestation, Epoch, EthSpec, Hash256, SignedBeaconBlock}; pub use websocket_server::WebSocketSender; pub trait EventHandler: Sized + Send + Sync { fn register(&self, kind: EventKind) -> Result<(), String>; } pub struct NullEventHandler(PhantomData); impl EventHandler for WebSocketSender { fn register(&self, kind: EventKind) -> Result<(), String> { self.send_string( serde_json::to_string(&kind) .map_err(|e| format!("Unable to serialize event: {:?}", e))?, ) } } impl EventHandler for NullEventHandler { fn register(&self, _kind: EventKind) -> Result<(), String> { Ok(()) } } impl Default for NullEventHandler { fn default() -> Self { NullEventHandler(PhantomData) } } #[derive(Debug, Serialize, Deserialize)] #[serde( bound = "T: EthSpec", rename_all = "snake_case", tag = "event", content = "data" )] pub enum EventKind { BeaconHeadChanged { reorg: bool, current_head_beacon_block_root: Hash256, previous_head_beacon_block_root: Hash256, }, BeaconFinalization { epoch: Epoch, root: Hash256, }, BeaconBlockImported { block_root: Hash256, block: Box>, }, BeaconBlockRejected { reason: String, block: Box>, }, BeaconAttestationImported { attestation: Box>, }, BeaconAttestationRejected { reason: String, attestation: Box>, }, }