reth_node_builder/
hooks.rs
1use std::fmt;
2
3use reth_node_api::{FullNodeComponents, NodeAddOns};
4
5use crate::node::FullNode;
6
7pub struct NodeHooks<Node: FullNodeComponents, AddOns: NodeAddOns<Node>> {
9 pub on_component_initialized: Box<dyn OnComponentInitializedHook<Node>>,
11 pub on_node_started: Box<dyn OnNodeStartedHook<Node, AddOns>>,
13 _marker: std::marker::PhantomData<Node>,
14}
15
16impl<Node, AddOns> NodeHooks<Node, AddOns>
17where
18 Node: FullNodeComponents,
19 AddOns: NodeAddOns<Node>,
20{
21 pub fn new() -> Self {
23 Self {
24 on_component_initialized: Box::<()>::default(),
25 on_node_started: Box::<()>::default(),
26 _marker: Default::default(),
27 }
28 }
29
30 pub(crate) fn set_on_component_initialized<F>(&mut self, hook: F) -> &mut Self
32 where
33 F: OnComponentInitializedHook<Node> + 'static,
34 {
35 self.on_component_initialized = Box::new(hook);
36 self
37 }
38
39 #[expect(unused)]
41 pub(crate) fn on_component_initialized<F>(mut self, hook: F) -> Self
42 where
43 F: OnComponentInitializedHook<Node> + 'static,
44 {
45 self.set_on_component_initialized(hook);
46 self
47 }
48
49 pub(crate) fn set_on_node_started<F>(&mut self, hook: F) -> &mut Self
51 where
52 F: OnNodeStartedHook<Node, AddOns> + 'static,
53 {
54 self.on_node_started = Box::new(hook);
55 self
56 }
57
58 #[expect(unused)]
60 pub(crate) fn on_node_started<F>(mut self, hook: F) -> Self
61 where
62 F: OnNodeStartedHook<Node, AddOns> + 'static,
63 {
64 self.set_on_node_started(hook);
65 self
66 }
67}
68
69impl<Node, AddOns> Default for NodeHooks<Node, AddOns>
70where
71 Node: FullNodeComponents,
72 AddOns: NodeAddOns<Node>,
73{
74 fn default() -> Self {
75 Self::new()
76 }
77}
78impl<Node, AddOns> fmt::Debug for NodeHooks<Node, AddOns>
79where
80 Node: FullNodeComponents,
81 AddOns: NodeAddOns<Node>,
82{
83 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
84 f.debug_struct("NodeHooks")
85 .field("on_component_initialized", &"...")
86 .field("on_node_started", &"...")
87 .finish()
88 }
89}
90
91pub trait OnComponentInitializedHook<Node>: Send {
93 fn on_event(self: Box<Self>, node: Node) -> eyre::Result<()>;
97}
98
99impl<Node, F> OnComponentInitializedHook<Node> for F
100where
101 F: FnOnce(Node) -> eyre::Result<()> + Send,
102{
103 fn on_event(self: Box<Self>, node: Node) -> eyre::Result<()> {
104 (*self)(node)
105 }
106}
107
108pub trait OnNodeStartedHook<Node: FullNodeComponents, AddOns: NodeAddOns<Node>>: Send {
110 fn on_event(self: Box<Self>, node: FullNode<Node, AddOns>) -> eyre::Result<()>;
114}
115
116impl<Node, AddOns, F> OnNodeStartedHook<Node, AddOns> for F
117where
118 Node: FullNodeComponents,
119 AddOns: NodeAddOns<Node>,
120 F: FnOnce(FullNode<Node, AddOns>) -> eyre::Result<()> + Send,
121{
122 fn on_event(self: Box<Self>, node: FullNode<Node, AddOns>) -> eyre::Result<()> {
123 (*self)(node)
124 }
125}
126
127impl<Node> OnComponentInitializedHook<Node> for () {
128 fn on_event(self: Box<Self>, _node: Node) -> eyre::Result<()> {
129 Ok(())
130 }
131}
132
133impl<Node, AddOns> OnNodeStartedHook<Node, AddOns> for ()
134where
135 Node: FullNodeComponents,
136 AddOns: NodeAddOns<Node>,
137{
138 fn on_event(self: Box<Self>, _node: FullNode<Node, AddOns>) -> eyre::Result<()> {
139 Ok(())
140 }
141}