use bytes::BytesMut;
use obs_proto::obs::v1::ObsEnvelope;
use super::{
SchemaRegistry,
erased::{EventSchemaErased, ScrubError},
};
#[derive(Clone, Copy)]
pub struct ScrubbedEnvelope<'a> {
inner: &'a ObsEnvelope,
payload: &'a [u8],
schema: Option<&'static dyn EventSchemaErased>,
}
impl std::fmt::Debug for ScrubbedEnvelope<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ScrubbedEnvelope")
.field("full_name", &self.inner.full_name)
.field("payload_len", &self.payload.len())
.field("schema", &self.schema.map(|s| s.full_name()))
.finish()
}
}
impl<'a> ScrubbedEnvelope<'a> {
#[allow(dead_code)] pub(crate) fn scrub(
env: &'a ObsEnvelope,
registry: &SchemaRegistry,
scratch: &'a mut BytesMut,
) -> Result<Self, ScrubError> {
let schema = registry.lookup(env);
let payload = match schema {
Some(s) => s.scrub_for_log(&env.payload, scratch)?,
None => env.payload.as_slice(),
};
Ok(Self {
inner: env,
payload,
schema,
})
}
#[must_use]
pub(crate) fn pass_through(env: &'a ObsEnvelope, registry: &SchemaRegistry) -> Self {
Self {
inner: env,
payload: &env.payload,
schema: registry.lookup(env),
}
}
#[cfg(feature = "test")]
#[must_use]
pub fn for_test(env: &'a ObsEnvelope, registry: &SchemaRegistry) -> Self {
Self::pass_through(env, registry)
}
#[must_use]
pub fn envelope(&self) -> &ObsEnvelope {
self.inner
}
#[must_use]
pub fn payload(&self) -> &[u8] {
self.payload
}
#[must_use]
pub fn schema(&self) -> Option<&'static dyn EventSchemaErased> {
self.schema
}
}