use std::io::Read;
use crate::{Magic, Version};
pub fn detect(mut reader: impl Read) -> Result<Version, DetectError> {
let mut magic: Magic = [0; 5];
reader.read_exact(&mut magic)?;
if magic != crate::MAGIC {
return Err(DetectError::InvalidMagic {
found: magic,
expected: crate::MAGIC,
});
}
let mut version = Version([0; 3]);
reader.read_exact(&mut version.0)?;
Ok(version)
}
#[derive(Debug, thiserror::Error)]
pub enum DetectError {
#[error(transparent)]
Io(#[from] std::io::Error),
#[error(
"Expected the magic bytes to be \"{}\", but found \"{}\"",
expected.escape_ascii(),
found.escape_ascii(),
)]
InvalidMagic { found: Magic, expected: Magic },
}