Skip to main content

ps_ecc/reed_solomon/methods/
encode.rs

1use ps_buffer::Buffer;
2
3use crate::error::RSEncodeError;
4use crate::ReedSolomon;
5
6impl ReedSolomon {
7    /// Encodes a message into a codeword.
8    /// # Errors
9    /// - [`ps_buffer::BufferError`] is returned if memory allocation fails.
10    /// - [`RSEncodeError::RSGenerateParityError`] if parity generation fails.
11    pub fn encode(&self, message: &[u8]) -> Result<Buffer, RSEncodeError> {
12        let mut buffer = Buffer::with_capacity(message.len() + usize::from(self.parity_bytes()))?;
13
14        buffer.extend_from_slice(self.generate_parity(message)?)?;
15        buffer.extend_from_slice(message)?;
16
17        Ok(buffer)
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use ps_buffer::ToBuffer;
24
25    use crate::ReedSolomon;
26
27    type TestError = Box<dyn std::error::Error>;
28
29    #[test]
30    fn test_encode_empty_message() -> Result<(), TestError> {
31        let rs = ReedSolomon::new(2)?;
32        let message = b"".to_buffer()?;
33        let encoded = rs.encode(&message)?;
34
35        assert_eq!(encoded.len(), 4); // 2 parity * 2 bytes
36        assert!(rs.validate(&encoded).is_none());
37
38        Ok(())
39    }
40}