use crate::error::Error;
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub enum OnError {
#[default]
Skip,
Fail,
Passthrough,
}
#[derive(Default, Debug, Clone)]
pub struct Stats {
pub records_in: u64,
pub records_out: u64,
pub bytes_in: u64,
pub bytes_out: u64,
pub oversized_skipped: u64,
pub oversized_passthrough: u64,
pub had_trailing_partial: bool,
}
impl Stats {
pub(crate) fn apply_oversize_policy(
&mut self,
policy: OnError,
offset: u64,
len: u64,
cap: u64,
) -> Result<bool, Error> {
match policy {
OnError::Skip => {
self.oversized_skipped += 1;
Ok(false)
}
OnError::Fail => Err(Error::OversizedRecord { offset, len, cap }),
OnError::Passthrough => {
self.oversized_passthrough += 1;
Ok(true)
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn skip_policy_drops_and_counts() {
let mut s = Stats::default();
let keep = s.apply_oversize_policy(OnError::Skip, 0, 100, 50).unwrap();
assert!(!keep);
assert_eq!(s.oversized_skipped, 1);
}
#[test]
fn fail_policy_errors() {
let mut s = Stats::default();
let err = s
.apply_oversize_policy(OnError::Fail, 42, 100, 50)
.unwrap_err();
assert!(matches!(
err,
Error::OversizedRecord {
offset: 42,
len: 100,
cap: 50
}
));
}
#[test]
fn passthrough_policy_emits_and_counts() {
let mut s = Stats::default();
let keep = s
.apply_oversize_policy(OnError::Passthrough, 0, 100, 50)
.unwrap();
assert!(keep);
assert_eq!(s.oversized_passthrough, 1);
}
}