#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ExceptionKind {
NoSuchObject,
NoSuchInstance,
EndOfMibView,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum BoundedStringKind {
OctetString,
Opaque,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum GetBulkField {
NonRepeaters,
MaxRepetitions,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum DecodeAnomaly {
SignedIntegerTruncation {
encoded_length: usize,
original: i64,
canonical: i32,
},
Unsigned32Truncation {
encoded_length: usize,
original: u64,
canonical: u32,
},
EmptyCounter64 {
original_length: usize,
canonical: u64,
},
EmptyObjectIdentifier {
original_length: usize,
canonical_arc_count: usize,
},
BoundedStringClamp {
kind: BoundedStringKind,
declared_length: usize,
canonical_length: usize,
},
NegativeGetBulkField {
field: GetBulkField,
original: i32,
canonical: u32,
},
MalformedExceptionPayload {
kind: ExceptionKind,
original_length: usize,
canonical_length: usize,
},
TrailingBytes {
original_length: usize,
canonical_length: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub struct DecodeConfig {
pub trailing_bytes: bool,
pub truncate_numeric_values: bool,
pub empty_counter64_as_zero: bool,
pub empty_object_identifier: bool,
pub clamp_bounded_strings: bool,
pub normalize_negative_get_bulk_fields: bool,
pub malformed_exception_payloads: bool,
}
impl DecodeConfig {
pub const STRICT: Self = Self {
trailing_bytes: false,
truncate_numeric_values: false,
empty_counter64_as_zero: false,
empty_object_identifier: false,
clamp_bounded_strings: false,
normalize_negative_get_bulk_fields: false,
malformed_exception_payloads: false,
};
pub const DEFAULT: Self = Self {
trailing_bytes: true,
truncate_numeric_values: true,
empty_counter64_as_zero: true,
empty_object_identifier: true,
clamp_bounded_strings: true,
normalize_negative_get_bulk_fields: true,
malformed_exception_payloads: false,
};
}
impl Default for DecodeConfig {
fn default() -> Self {
Self::DEFAULT
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decode_config_defaults_are_explicit() {
let config = DecodeConfig::default();
assert!(config.trailing_bytes);
assert!(config.truncate_numeric_values);
assert!(config.empty_counter64_as_zero);
assert!(config.empty_object_identifier);
assert!(config.clamp_bounded_strings);
assert!(config.normalize_negative_get_bulk_fields);
assert!(!config.malformed_exception_payloads);
}
}