reth_node_builder/
hooks.rs

1use std::fmt;
2
3use reth_node_api::{FullNodeComponents, NodeAddOns};
4
5use crate::node::FullNode;
6
7/// Container for all the configurable hook functions.
8pub struct NodeHooks<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> {
9    /// Hook to run once core components are initialized.
10    pub on_component_initialized: Box<dyn OnComponentInitializedHook<Node>>,
11    /// Hook to run once the node is started.
12    pub on_node_started: Box<dyn OnNodeStartedHook<Node, AddOns>>,
13}
14
15impl<Node, AddOns> NodeHooks<Node, AddOns>
16where
17    Node: FullNodeComponents,
18    AddOns: NodeAddOns<Node>,
19{
20    /// Creates a new, empty [`NodeHooks`] instance for the given node type.
21    pub fn new() -> Self {
22        Self {
23            on_component_initialized: Box::<()>::default(),
24            on_node_started: Box::<()>::default(),
25        }
26    }
27
28    /// Sets the hook that is run once the node's components are initialized.
29    pub(crate) fn set_on_component_initialized<F>(&mut self, hook: F) -> &mut Self
30    where
31        F: OnComponentInitializedHook<Node> + 'static,
32    {
33        self.on_component_initialized = Box::new(hook);
34        self
35    }
36
37    /// Sets the hook that is run once the node's components are initialized.
38    #[expect(unused)]
39    pub(crate) fn on_component_initialized<F>(mut self, hook: F) -> Self
40    where
41        F: OnComponentInitializedHook<Node> + 'static,
42    {
43        self.set_on_component_initialized(hook);
44        self
45    }
46
47    /// Sets the hook that is run once the node has started.
48    pub(crate) fn set_on_node_started<F>(&mut self, hook: F) -> &mut Self
49    where
50        F: OnNodeStartedHook<Node, AddOns> + 'static,
51    {
52        self.on_node_started = Box::new(hook);
53        self
54    }
55
56    /// Sets the hook that is run once the node has started.
57    #[expect(unused)]
58    pub(crate) fn on_node_started<F>(mut self, hook: F) -> Self
59    where
60        F: OnNodeStartedHook<Node, AddOns> + 'static,
61    {
62        self.set_on_node_started(hook);
63        self
64    }
65}
66
67impl<Node, AddOns> Default for NodeHooks<Node, AddOns>
68where
69    Node: FullNodeComponents,
70    AddOns: NodeAddOns<Node>,
71{
72    fn default() -> Self {
73        Self::new()
74    }
75}
76impl<Node, AddOns> fmt::Debug for NodeHooks<Node, AddOns>
77where
78    Node: FullNodeComponents,
79    AddOns: NodeAddOns<Node>,
80{
81    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
82        f.debug_struct("NodeHooks")
83            .field("on_component_initialized", &"...")
84            .field("on_node_started", &"...")
85            .finish()
86    }
87}
88
89/// A helper trait for the event hook that is run once the node is initialized.
90pub trait OnComponentInitializedHook<Node>: Send {
91    /// Consumes the event hook and runs it.
92    ///
93    /// If this returns an error, the node launch will be aborted.
94    fn on_event(self: Box<Self>, node: Node) -> eyre::Result<()>;
95}
96
97impl<Node, F> OnComponentInitializedHook<Node> for F
98where
99    F: FnOnce(Node) -> eyre::Result<()> + Send,
100{
101    fn on_event(self: Box<Self>, node: Node) -> eyre::Result<()> {
102        (*self)(node)
103    }
104}
105
106/// A helper trait that is run once the node is started.
107pub trait OnNodeStartedHook<Node: FullNodeComponents, AddOns: NodeAddOns<Node>>: Send {
108    /// Consumes the event hook and runs it.
109    ///
110    /// If this returns an error, the node launch will be aborted.
111    fn on_event(self: Box<Self>, node: FullNode<Node, AddOns>) -> eyre::Result<()>;
112}
113
114impl<Node, AddOns, F> OnNodeStartedHook<Node, AddOns> for F
115where
116    Node: FullNodeComponents,
117    AddOns: NodeAddOns<Node>,
118    F: FnOnce(FullNode<Node, AddOns>) -> eyre::Result<()> + Send,
119{
120    fn on_event(self: Box<Self>, node: FullNode<Node, AddOns>) -> eyre::Result<()> {
121        (*self)(node)
122    }
123}
124
125impl<Node> OnComponentInitializedHook<Node> for () {
126    fn on_event(self: Box<Self>, _node: Node) -> eyre::Result<()> {
127        Ok(())
128    }
129}
130
131impl<Node, AddOns> OnNodeStartedHook<Node, AddOns> for ()
132where
133    Node: FullNodeComponents,
134    AddOns: NodeAddOns<Node>,
135{
136    fn on_event(self: Box<Self>, _node: FullNode<Node, AddOns>) -> eyre::Result<()> {
137        Ok(())
138    }
139}