use std::sync::Arc;
use obs_proto::obs::v1::ObsEnvelope;
use super::Observer;
pub use crate::sink::InMemoryHandle;
use crate::{
registry::{SchemaRegistry, ScrubbedEnvelope},
sink::{InMemorySink, Sink},
};
#[derive(Debug, Clone)]
pub struct InMemoryObserver {
sink: InMemorySink,
registry: Arc<SchemaRegistry>,
}
impl InMemoryObserver {
#[must_use]
pub fn new() -> Self {
Self {
sink: InMemorySink::new(),
registry: Arc::new(SchemaRegistry::empty()),
}
}
#[must_use]
pub fn with_sink(sink: InMemorySink) -> Self {
Self {
sink,
registry: Arc::new(SchemaRegistry::empty()),
}
}
#[must_use]
pub fn handle(&self) -> InMemoryHandle {
self.sink.handle()
}
}
impl Default for InMemoryObserver {
fn default() -> Self {
Self::new()
}
}
impl Observer for InMemoryObserver {
fn emit_envelope(&self, mut env: ObsEnvelope) {
crate::scope::auto_fill_envelope(&mut env);
let envref: &ObsEnvelope = &env;
let scrubbed = ScrubbedEnvelope::pass_through(envref, &self.registry);
self.sink.deliver(scrubbed);
}
fn enabled(&self, _callsite: &crate::ObsCallsite) -> bool {
true
}
}