#![cfg(feature = "client")]
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
use std::sync::Arc;
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
use sentry_types::protocol::v7::client_report::ItemLoss;
use sentry_types::protocol::v7::client_report::{Category, LossSource, Reason};
use sentry_types::protocol::v7::ClientReport;
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
use self::inner::ClientReportAggregatorInner;
mod inner;
mod recorder;
pub use self::recorder::{Recorder, TransportLossReason};
#[derive(Debug, Clone, Default)]
pub(crate) struct ClientReportAggregator {
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
inner: Arc<ClientReportAggregatorInner>,
}
impl ClientReportAggregator {
pub(crate) fn new() -> Self {
Self::default()
}
pub(crate) fn record_lost_data<L>(&self, data: &L, reason: Reason)
where
L: LossSource + ?Sized,
{
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
data.losses().for_each(|loss| {
let ItemLoss {
category,
quantity,
reason: reason_override,
..
} = loss;
let reason = reason_override.unwrap_or(reason);
self.record_loss(category, reason, quantity)
});
#[cfg(not(all(target_has_atomic = "64", target_has_atomic = "8")))]
let _ = (data, reason);
}
pub(crate) fn record_loss(&self, category: Category, reason: Reason, quantity: u64) {
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
self.inner.record_loss(category, reason, quantity);
#[cfg(not(all(target_has_atomic = "64", target_has_atomic = "8")))]
let _ = (category, reason, quantity);
}
pub(crate) fn take_pending_report(&self) -> Option<ClientReport> {
#[cfg(all(target_has_atomic = "64", target_has_atomic = "8"))]
{
self.inner.take_pending_report()
}
#[cfg(not(all(target_has_atomic = "64", target_has_atomic = "8")))]
{
None
}
}
pub(super) fn recorder(&self) -> Recorder {
Recorder::new(self)
}
}