pub struct Diagnostics { /* private fields */ }Expand description
A bounded sink of Diagnostics.
Bounded because a sufficiently broken file produces a diagnostic per object: past the limit the entries are counted but not stored, so a fuzz case cannot turn a diagnostic channel into an out-of-memory condition.
use pdfrum_common::{DiagKind, Diagnostics, Severity};
let mut diags = Diagnostics::with_limit(1);
diags.record(Severity::Recovered, DiagKind::XrefRebuilt, None);
diags.record(Severity::Suspicious, DiagKind::MalformedDict, Some(42));
assert_eq!(diags.len(), 1); // second entry counted, not stored
assert_eq!(diags.recorded(), 2);
assert!(diags.dropped() > 0);Implementations§
Source§impl Diagnostics
impl Diagnostics
Sourcepub const DEFAULT_LIMIT: usize = 4096
pub const DEFAULT_LIMIT: usize = 4096
Default number of diagnostics kept before the sink starts counting only. Chosen to survive a pathological file without unbounded growth.
Sourcepub fn with_limit(limit: usize) -> Self
pub fn with_limit(limit: usize) -> Self
An empty sink keeping at most limit entries.
Sourcepub fn record(&mut self, severity: Severity, what: DiagKind, at: Option<u64>)
pub fn record(&mut self, severity: Severity, what: DiagKind, at: Option<u64>)
Record a recovery. Never fails; past the limit the entry is counted but not stored.
Sourcepub fn extend(&mut self, other: &Diagnostics)
pub fn extend(&mut self, other: &Diagnostics)
Fold another sink’s diagnostics into this one, keeping their order.
A call that reads through the stack collects into its own sink; the
caller that owns the longer-lived record folds it in when the call
returns. This crate’s own limit still applies, so merging a full sink
into a full one counts the entries without storing them, exactly as
Diagnostics::record does.
use pdfrum_common::{DiagKind, Diagnostics, Severity};
let mut whole = Diagnostics::default();
let mut part = Diagnostics::default();
part.record(Severity::Recovered, DiagKind::XrefRebuilt, Some(9));
whole.extend(&part);
assert!(whole.contains(&DiagKind::XrefRebuilt));
// `part` is unchanged: this reads it rather than draining it.
assert_eq!(part.len(), 1);Sourcepub fn entries(&self) -> &[Diagnostic]
pub fn entries(&self) -> &[Diagnostic]
The stored diagnostics, in the order they were recorded.
Trait Implementations§
Source§impl Clone for Diagnostics
impl Clone for Diagnostics
Source§fn clone(&self) -> Diagnostics
fn clone(&self) -> Diagnostics
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more