use super::error::{Bad, Num};
type Layout = [(usize, Bad)];
pub(super) const LAYOUT_51: &Layout = &[
(4, Bad::NotBinary),
(5, Bad::Version),
(6, Bad::Format),
(7, Bad::NumFormat(Num::Integer)),
(8, Bad::Size(Num::Int)),
(9, Bad::Size(Num::SizeT)),
(10, Bad::Size(Num::Instruction)),
(11, Bad::Size(Num::Number)),
(12, Bad::NumFormat(Num::Number)),
];
pub(super) const LAYOUT_52: &Layout = &[
(4, Bad::NotBinary),
(5, Bad::Version),
(6, Bad::Format),
(7, Bad::NumFormat(Num::Integer)),
(8, Bad::Size(Num::Int)),
(9, Bad::Size(Num::SizeT)),
(10, Bad::Size(Num::Instruction)),
(11, Bad::Size(Num::Number)),
(12, Bad::NumFormat(Num::Number)),
(18, Bad::Corrupted),
];
pub(super) const LAYOUT_53: &Layout = &[
(4, Bad::NotBinary),
(5, Bad::Version),
(6, Bad::Format),
(12, Bad::Corrupted),
(13, Bad::Size(Num::Int)),
(14, Bad::Size(Num::SizeT)),
(15, Bad::Size(Num::Instruction)),
(16, Bad::Size(Num::Integer)),
(17, Bad::Size(Num::Number)),
(25, Bad::NumFormat(Num::Integer)),
(33, Bad::NumFormat(Num::Number)),
];
pub(super) const LAYOUT_54: &Layout = &[
(4, Bad::NotBinary),
(5, Bad::Version),
(6, Bad::Format),
(12, Bad::Corrupted),
(13, Bad::Size(Num::Instruction)),
(14, Bad::Size(Num::Integer)),
(15, Bad::Size(Num::Number)),
(23, Bad::NumFormat(Num::Integer)),
(31, Bad::NumFormat(Num::Number)),
];
pub(super) const LAYOUT_55: &Layout = &[
(4, Bad::NotBinary),
(5, Bad::Version),
(6, Bad::Format),
(12, Bad::Corrupted),
(13, Bad::Size(Num::Int)),
(17, Bad::NumFormat(Num::Int)),
(18, Bad::Size(Num::Instruction)),
(22, Bad::NumFormat(Num::Instruction)),
(23, Bad::Size(Num::Integer)),
(31, Bad::NumFormat(Num::Integer)),
(32, Bad::Size(Num::Number)),
(40, Bad::NumFormat(Num::Number)),
];
pub(super) fn check(bytes: &[u8], expected: &[u8], layout: &Layout) -> Result<(), Bad> {
debug_assert_eq!(layout.last().map(|f| f.0), Some(expected.len()));
for (i, &want) in expected.iter().enumerate() {
let Some(&got) = bytes.get(i) else {
return Err(Bad::Truncated);
};
if got != want {
let field = layout
.iter()
.find(|f| i < f.0)
.expect("the layout covers the header");
return Err(field.1.clone());
}
}
Ok(())
}