#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
use std::sync::{Arc, Weak};
use sentry_types::protocol::v7::client_report::LossSource;
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
use sentry_types::protocol::v7::client_report::Reason;
use super::ClientReportAggregator;
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
use super::ClientReportAggregatorInner;
#[derive(Debug, Clone, Default)]
pub struct Recorder {
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
inner: Weak<ClientReportAggregatorInner>,
}
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub enum TransportLossReason {
SendError,
InternalError,
NetworkError,
RatelimitBackoff,
QueueOverflow,
}
impl Recorder {
pub fn record_lost_data<L: LossSource>(&self, data: &L, reason: TransportLossReason) {
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
if let Some(aggregator) = self.aggregator() {
aggregator.record_lost_data(data, reason.into_reason());
}
#[cfg(not(all(target_has_atomic = "8", target_has_atomic = "64")))]
let _ = (data, reason);
}
pub(crate) fn new_no_op() -> Self {
Self {
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
inner: Weak::new(),
}
}
pub(super) fn new(aggregator: &ClientReportAggregator) -> Self {
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
{
let ClientReportAggregator {
inner: aggregator_inner,
} = aggregator;
let inner = Arc::downgrade(aggregator_inner);
Self { inner }
}
#[cfg(not(all(target_has_atomic = "8", target_has_atomic = "64")))]
{
let _ = aggregator;
Self {}
}
}
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
fn aggregator(&self) -> Option<ClientReportAggregator> {
self.inner
.upgrade()
.map(|inner| ClientReportAggregator { inner })
}
}
impl TransportLossReason {
#[cfg(all(target_has_atomic = "8", target_has_atomic = "64"))]
fn into_reason(self) -> Reason {
match self {
Self::SendError => Reason::SendError,
Self::InternalError => Reason::InternalSdkError,
Self::NetworkError => Reason::NetworkError,
Self::RatelimitBackoff => Reason::RatelimitBackoff,
Self::QueueOverflow => Reason::QueueOverflow,
}
}
}