use sentry_core::Breadcrumb;
use tracing_core::{Event, Subscriber};
use tracing_subscriber::layer::{Context, Layer};
use tracing_subscriber::registry::LookupSpan;
use crate::converters::breadcrumb_from_event_impl;
#[must_use]
#[derive(Default)]
pub struct BreadcrumbLayer {
with_span_attributes: bool,
}
impl BreadcrumbLayer {
pub fn new() -> Self {
Self::default()
}
pub fn enable_span_attributes(mut self) -> Self {
self.with_span_attributes = true;
self
}
pub(super) fn capture(&self, breadcrumb: Breadcrumb) {
sentry_core::add_breadcrumb(breadcrumb);
}
}
impl BreadcrumbLayer {
pub(super) fn capture_tracing_event<S>(&self, event: &Event, ctx: Context<'_, S>)
where
S: Subscriber + for<'a> LookupSpan<'a>,
{
self.capture(breadcrumb_from_event_impl(
event,
self.with_span_attributes.then_some(&ctx),
));
}
}
impl<S> Layer<S> for BreadcrumbLayer
where
S: Subscriber + for<'a> LookupSpan<'a>,
{
fn on_event(&self, event: &Event, ctx: Context<'_, S>) {
self.capture_tracing_event(event, ctx);
}
}