use crate::SkipReport;
pub trait Diagnostics {
fn record_skip(&mut self, report: SkipReport);
}
#[derive(Debug, Default)]
pub struct NullDiagnostics;
impl Diagnostics for NullDiagnostics {
fn record_skip(&mut self, _: SkipReport) {}
}
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct VecDiagnostics {
pub skips: Vec<SkipReport>,
}
impl VecDiagnostics {
pub fn skips(&self) -> &[SkipReport] {
&self.skips
}
}
impl Diagnostics for VecDiagnostics {
fn record_skip(&mut self, report: SkipReport) {
self.skips.push(report);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::SkipReason;
#[test]
fn null_sink_drops_events() {
let mut diag = NullDiagnostics;
diag.record_skip(SkipReport {
record_index: 1,
reason: SkipReason::MissingField { field: "x".into() },
});
}
#[test]
fn vec_sink_collects_in_order() {
let mut diag = VecDiagnostics::default();
diag.record_skip(SkipReport {
record_index: 0,
reason: SkipReason::MissingField { field: "a".into() },
});
diag.record_skip(SkipReport {
record_index: 1,
reason: SkipReason::MissingField { field: "b".into() },
});
assert_eq!(diag.skips.len(), 2);
assert_eq!(diag.skips[0].record_index, 0);
assert_eq!(diag.skips[1].record_index, 1);
}
}