use crate::observation::Source;
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct EnumerationAnomaly {
pub source: Source,
pub offset: usize,
pub kind: AnomalyKind,
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum AnomalyKind {
Undersized {
declared: usize,
minimum: usize,
},
OverrunsBuffer {
declared: usize,
remaining: usize,
},
TrailingBytes {
remaining: usize,
},
TruncatedArray {
declared: usize,
decoded: usize,
},
}
impl EnumerationAnomaly {
pub(crate) fn undersized(
source: Source,
offset: usize,
declared: usize,
minimum: usize,
) -> Self {
Self {
source,
offset,
kind: AnomalyKind::Undersized { declared, minimum },
}
}
pub(crate) fn overruns(
source: Source,
offset: usize,
declared: usize,
remaining: usize,
) -> Self {
Self {
source,
offset,
kind: AnomalyKind::OverrunsBuffer {
declared,
remaining,
},
}
}
pub(crate) fn trailing_bytes(source: Source, offset: usize, remaining: usize) -> Self {
Self {
source,
offset,
kind: AnomalyKind::TrailingBytes { remaining },
}
}
pub(crate) fn truncated_array(
source: Source,
offset: usize,
declared: usize,
decoded: usize,
) -> Self {
Self {
source,
offset,
kind: AnomalyKind::TruncatedArray { declared, decoded },
}
}
}