use crate::{codeword::Codeword, long, DecodeError, ReedSolomon};
pub fn decode(received: &[u8], parity: u8) -> Result<Codeword<'_>, DecodeError> {
if let Ok(length) = u8::try_from(received.len()) {
if parity > length >> 1 {
return Err(DecodeError::InsufficientParityBytes(parity, length));
}
let rs = ReedSolomon::new(parity)?;
Ok(rs.decode(received)?)
} else {
Ok(long::decode(received)?)
}
}
#[cfg(test)]
mod tests {
use crate::{decode, encode, EccError};
#[test]
fn ecc_works() -> Result<(), EccError> {
let test_str = "Strč prst skrz krk! ¯\\_(ツ)_/¯".as_bytes();
let mut encoded = encode(test_str, 13)?;
for i in 0..13 {
let index = (i * 37) % encoded.len();
encoded[index] ^= (i * index + 13).to_le_bytes()[0];
let decoded = decode(&encoded, 13)?;
assert_eq!(test_str, &decoded[..]);
}
Ok(())
}
}