use super::*;
pub fn from_single_object_slice<'a, T>(slice: &'a [u8], schema: &Schema) -> Result<T, de::DeError>
where
T: serde::Deserialize<'a>,
{
let header: &[u8; 10] = slice
.get(0..10)
.ok_or_else(|| de::DeError::new("Slice is too short for single object encoding header"))?
.try_into()
.unwrap();
check_header(header, schema)?;
from_datum_slice(&slice[10..], schema)
}
pub fn from_single_object_reader<R, T>(mut reader: R, schema: &Schema) -> Result<T, de::DeError>
where
T: serde::de::DeserializeOwned,
R: std::io::Read,
{
let mut header_buf = [0u8; 10];
reader
.read_exact(&mut header_buf)
.map_err(de::DeError::io)?;
check_header(&header_buf, schema)?;
from_datum_reader(reader, schema)
}
fn check_header(slice: &[u8; 10], schema: &Schema) -> Result<(), de::DeError> {
if slice[0..2] != [0xC3, 0x01] {
return Err(de::DeError::new(
"Single object slice does not respect C3 01 header",
));
}
if &slice[2..10] != schema.rabin_fingerprint() {
return Err(de::DeError::new(
"Single object encoding fingerprint header does not match with schema fingerprint",
));
}
Ok(())
}