Skip to main content

ps_ecc/methods/
encode.rs

1use ps_buffer::Buffer;
2
3use crate::{long, EncodeError, ReedSolomon};
4
5/// Encodes a message by adding an error-correcting code.
6///
7/// Messages longer than `255 - 2 * parity` bytes are encoded in the long ECC
8/// format; all other messages become a single Reed-Solomon codeword.
9/// # Errors
10/// For messages that fit a single codeword:
11/// - `RSConstructorError` is returned if `parity` exceeds [`crate::MAX_PARITY`].
12/// - `RSEncodeError` is returned if encoding fails.
13///
14/// For longer messages:
15/// - `LongEccEncodeError` is returned if long encoding fails.
16pub fn encode(message: &[u8], parity: u8) -> Result<Buffer, EncodeError> {
17    if message.len() + (usize::from(parity) << 1) > 0xff {
18        let codeword = long::encode(message, parity, long::OverlapFactor::Simple)?;
19
20        return Ok(codeword);
21    }
22
23    let rs = ReedSolomon::new(parity)?;
24
25    Ok(rs.encode(message)?)
26}