use crate::LongEccFastValidateError;
use super::checksums::xxh64;
use super::{LongEccHeader, HEADER_SIZE};
pub fn fast_validate(codeword: &[u8]) -> Result<(LongEccHeader, bool), LongEccFastValidateError> {
let header = LongEccHeader::from_byte_slice(codeword)?;
if codeword[..HEADER_SIZE] != header.to_bytes() {
return Ok((header, false));
}
let full_length = usize::try_from(header.full_length())?;
if codeword.len() != full_length {
return Ok((header, false));
}
let Some(payload) = codeword.get(HEADER_SIZE..full_length) else {
return Ok((header, false));
};
Ok((header, xxh64(payload) == header.checksum()))
}
#[cfg(test)]
mod tests {
use ps_buffer::ToBuffer;
use super::super::{encode, OverlapFactor};
use super::fast_validate;
type TestError = Box<dyn std::error::Error>;
#[test]
fn test_fast_validate_pristine_codeword() -> Result<(), TestError> {
let message = b"Pristine Codeword".to_buffer()?;
let encoded = encode(&message, 2, OverlapFactor::Simple)?;
assert!(fast_validate(&encoded)?.1);
Ok(())
}
#[test]
fn test_fast_validate_rejects_trailing_bytes() -> Result<(), TestError> {
let message = b"Trailing Bytes".to_buffer()?;
let encoded = encode(&message, 2, OverlapFactor::Simple)?;
let mut extended = encoded.to_vec();
extended.push(0xAB);
assert!(!fast_validate(&extended)?.1);
Ok(())
}
}