From fe04dd9aca396eb939c50748b8824849ea05fb8a Mon Sep 17 00:00:00 2001 From: MicaiahReid Date: Mon, 24 Jun 2024 14:01:28 -0400 Subject: [PATCH] add builder for starting an event observer --- components/chainhook-sdk/src/observer/mod.rs | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/components/chainhook-sdk/src/observer/mod.rs b/components/chainhook-sdk/src/observer/mod.rs index 12dc675bb..c790b9477 100644 --- a/components/chainhook-sdk/src/observer/mod.rs +++ b/components/chainhook-sdk/src/observer/mod.rs @@ -644,6 +644,89 @@ impl ObserverSidecar { } } +/// A helper struct used to configure and call [start_event_observer], which spawns a thread to observer chain events. +/// +/// ### Examples +/// ``` +/// use chainhook_sdk::observer::EventObserver; +/// +/// fn start_event_observer() -> Result<(), Box> { +/// EventObserver::new( +/// config, +/// &observer_commands_tx, +/// observer_commands_rx, +/// &ctx +/// ) +/// .stacks_startup_context(context) +/// .start() +/// } +/// ``` +pub struct EventObserverBuilder { + config: EventObserverConfig, + observer_commands_tx: Sender, + observer_commands_rx: Receiver, + ctx: Context, + observer_events_tx: Option>, + observer_sidecar: Option, + stacks_startup_context: Option, +} + +impl EventObserverBuilder { + pub fn new( + config: EventObserverConfig, + observer_commands_tx: &Sender, + observer_commands_rx: Receiver, + ctx: &Context, + ) -> Self { + EventObserverBuilder { + config: config, + observer_commands_tx: observer_commands_tx.clone(), + observer_commands_rx: observer_commands_rx, + ctx: ctx.clone(), + observer_events_tx: None, + observer_sidecar: None, + stacks_startup_context: None, + } + } + + /// Sets the `observer_events_tx` Sender. Set this and listen on the corresponding + /// Receiver to be notified of every [ObserverEvent]. + pub fn events_tx( + &mut self, + observer_events_tx: crossbeam_channel::Sender, + ) -> &mut Self { + self.observer_events_tx = Some(observer_events_tx); + self + } + + /// Sets a sidecar for the observer. See [ObserverSidecar]. + pub fn sidecar(&mut self, sidecar: ObserverSidecar) -> &mut Self { + self.observer_sidecar = Some(sidecar); + self + } + + /// Sets the Stacks startup context. See [StacksObserverStartupContext]. + pub fn stacks_startup_context(&mut self, context: StacksObserverStartupContext) -> &mut Self { + self.stacks_startup_context = Some(context); + self + } + + /// Starts the event observer, calling [start_event_observer]. This function consumes the + /// [EventObserverBuilder] and spawns a new thread to run the observer. + pub fn start(self) -> Result<(), Box> { + start_event_observer( + self.config, + self.observer_commands_tx, + self.observer_commands_rx, + self.observer_events_tx, + self.observer_sidecar, + self.stacks_startup_context, + self.ctx, + ) + } +} + +/// Spawns a thread to observe blockchain events. Use [EventObserverBuilder] to configure easily. pub fn start_event_observer( config: EventObserverConfig, observer_commands_tx: Sender,