use crate::event::observability::ObservabilityContext;
use crate::event::{JournalEvent, JournalRecord};
use std::panic::{catch_unwind, AssertUnwindSafe};
pub type ObservationCapture<T> = Box<dyn FnMut(usize, &T) -> Option<ObservabilityContext> + Send>;
pub enum JournalCapture<T: JournalEvent> {
Live(Option<ObservationCapture<T>>),
Historical,
}
impl<T: JournalEvent> JournalCapture<T> {
pub fn prepare(&mut self, member: usize, event: T) -> T {
if let Self::Live(Some(capture)) = self {
if let Ok(packet) = catch_unwind(AssertUnwindSafe(|| capture(member, &event))) {
let (mut envelope, payload) = event.into_parts();
envelope.observability = packet;
return T::from_parts(envelope, payload);
}
}
event
}
}
impl<T: JournalEvent> Default for JournalCapture<T> {
fn default() -> Self {
Self::Live(None)
}
}
pub struct AppendOptions<'a, T: JournalEvent> {
pub parent: Option<&'a JournalRecord<T::Payload>>,
pub capture: JournalCapture<T>,
}
impl<'a, T: JournalEvent> AppendOptions<'a, T> {
pub fn new(parent: Option<&'a JournalRecord<T::Payload>>) -> Self {
Self {
parent,
capture: JournalCapture::default(),
}
}
pub fn with_capture(mut self, capture: JournalCapture<T>) -> Self {
self.capture = capture;
self
}
}
impl<T: JournalEvent> Default for AppendOptions<'_, T> {
fn default() -> Self {
Self::new(None)
}
}