use crate::col_peek_version::peek_version;
use crate::{FormatError, Splash, MAX_SERIALIZED_BYTES, SPLASH_MIN_SUPPORTED, SPLASH_VERSION};
pub fn read_splash(bytes: &[u8]) -> Result<Splash, FormatError> {
if bytes.len() > MAX_SERIALIZED_BYTES {
return Err(FormatError::PayloadTooLarge {
len: bytes.len(),
max: MAX_SERIALIZED_BYTES,
});
}
let version = peek_version(bytes);
if let Some(found) = version {
check_version(found)?;
}
let splash: Splash =
rmp_serde::from_slice(bytes).map_err(|err| FormatError::Decode(err.to_string()))?;
check_version(splash.version)?;
splash.validate()?;
Ok(splash)
}
fn check_version(found: u8) -> Result<(), FormatError> {
if !(SPLASH_MIN_SUPPORTED..=SPLASH_VERSION).contains(&found) {
return Err(FormatError::UnsupportedVersion {
format: "splash",
found,
min_supported: SPLASH_MIN_SUPPORTED,
current: SPLASH_VERSION,
});
}
Ok(())
}