use std::fmt; use reth_node_api::{FullNodeComponents, NodeAddOns}; use crate::node::FullNode; /// Container for all the configurable hook functions. pub struct NodeHooks> { /// Hook to run once core components are initialized. pub on_component_initialized: Box>, /// Hook to run once the node is started. pub on_node_started: Box>, _marker: std::marker::PhantomData, } impl NodeHooks where Node: FullNodeComponents, AddOns: NodeAddOns, { /// Creates a new, empty [`NodeHooks`] instance for the given node type. pub fn new() -> Self { Self { on_component_initialized: Box::<()>::default(), on_node_started: Box::<()>::default(), _marker: Default::default(), } } /// Sets the hook that is run once the node's components are initialized. pub(crate) fn set_on_component_initialized(&mut self, hook: F) -> &mut Self where F: OnComponentInitializedHook + 'static, { self.on_component_initialized = Box::new(hook); self } /// Sets the hook that is run once the node's components are initialized. #[allow(unused)] pub(crate) fn on_component_initialized(mut self, hook: F) -> Self where F: OnComponentInitializedHook + 'static, { self.set_on_component_initialized(hook); self } /// Sets the hook that is run once the node has started. pub(crate) fn set_on_node_started(&mut self, hook: F) -> &mut Self where F: OnNodeStartedHook + 'static, { self.on_node_started = Box::new(hook); self } /// Sets the hook that is run once the node has started. #[allow(unused)] pub(crate) fn on_node_started(mut self, hook: F) -> Self where F: OnNodeStartedHook + 'static, { self.set_on_node_started(hook); self } } impl Default for NodeHooks where Node: FullNodeComponents, AddOns: NodeAddOns, { fn default() -> Self { Self::new() } } impl fmt::Debug for NodeHooks where Node: FullNodeComponents, AddOns: NodeAddOns, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("NodeHooks") .field("on_component_initialized", &"...") .field("on_node_started", &"...") .finish() } } /// A helper trait for the event hook that is run once the node is initialized. pub trait OnComponentInitializedHook: Send { /// Consumes the event hook and runs it. /// /// If this returns an error, the node launch will be aborted. fn on_event(self: Box, node: Node) -> eyre::Result<()>; } impl OnComponentInitializedHook for F where F: FnOnce(Node) -> eyre::Result<()> + Send, { fn on_event(self: Box, node: Node) -> eyre::Result<()> { (*self)(node) } } /// A helper trait that is run once the node is started. pub trait OnNodeStartedHook>: Send { /// Consumes the event hook and runs it. /// /// If this returns an error, the node launch will be aborted. fn on_event(self: Box, node: FullNode) -> eyre::Result<()>; } impl OnNodeStartedHook for F where Node: FullNodeComponents, AddOns: NodeAddOns, F: FnOnce(FullNode) -> eyre::Result<()> + Send, { fn on_event(self: Box, node: FullNode) -> eyre::Result<()> { (*self)(node) } } impl OnComponentInitializedHook for () { fn on_event(self: Box, _node: Node) -> eyre::Result<()> { Ok(()) } } impl OnNodeStartedHook for () where Node: FullNodeComponents, AddOns: NodeAddOns, { fn on_event(self: Box, _node: FullNode) -> eyre::Result<()> { Ok(()) } }