1mod encoder;
2use encoder::Encoder;
3
4mod decoder;
5pub use decoder::DecodeError;
6use decoder::Decoder;
7
8pub fn encode(input: impl IntoIterator<Item = u8>) -> Vec<u8> {
9 let mut encoder = Encoder::new();
10
11 for byte in input {
12 encoder.feed(byte);
13 }
14
15 encoder.output()
16}
17
18pub fn decode(input: impl IntoIterator<Item = u8>) -> Result<Vec<u8>, DecodeError> {
19 let mut decoder = Decoder::new();
20 let mut iter = input.into_iter();
21
22 while let Some(byte) = iter.next() {
23 decoder.feed(byte)?;
24 }
25
26 decoder.output()
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32
33 #[test]
34 fn test_encode_decode() {
35 let data = vec![0, 0, 0xFF, 0, 0, 0, 0xFF, 0];
36 let encoded = encode(data.clone());
37 let decoded = decode(encoded).unwrap();
38 assert_eq!(data, decoded);
39 }
40
41 #[test]
42 fn test_encode_decode_empty() {
43 let data: Vec<u8> = vec![];
44 let encoded = encode(data.clone());
45 let decoded = decode(encoded);
46 assert_eq!(Ok(data), decoded);
47 }
48
49 #[test]
50 fn test_encode_decode_no_zeros() {
51 let data = vec![1, 2, 3, 4, 5];
52 let encoded = encode(data.clone());
53 let decoded = decode(encoded);
54 assert_eq!(Ok(data), decoded);
55 }
56
57 #[test]
58 fn test_encode_decode_no_zeros_or_ff() {
59 let data = vec![1, 2, 3, 4, 5];
60 let encoded = encode(data.clone());
61 let decoded = decode(encoded);
62 assert_eq!(Ok(data), decoded);
63 }
64
65 #[test]
66 fn test_encode_decode_only_zeros() {
67 let data = vec![0, 0, 0, 0];
68 let encoded = encode(data.clone());
69 assert_eq!(encoded, vec![0xFF, 4]);
70 let decoded = decode(encoded);
71 assert_eq!(Ok(data), decoded);
72 }
73
74 #[test]
75 fn test_encode_decode_only_ff() {
76 let data = vec![0xFF, 0xFF, 0xFF];
77 let encoded = encode(data.clone());
78 assert_eq!(encoded, vec![0xFF, 2, 0xFF, 1]);
79 let decoded = decode(encoded);
80 assert_eq!(Ok(data), decoded);
81 }
82
83 #[test]
84 fn test_encode_decode_mixed() {
85 let data = vec![0, 0xFF, 1, 2, 0, 0, 0xFF, 3];
86 let encoded = encode(data.clone());
87 let decoded = decode(encoded);
88 assert_eq!(Ok(data), decoded);
89 }
90
91 #[test]
92 fn test_encode_decode_large_run() {
93 let data = vec![0; 300];
94 let encoded = encode(data.clone());
95 assert_eq!(encoded, vec![0xFF, 255, 0xFF, 45]);
96 let decoded = decode(encoded);
97 assert_eq!(Ok(data), decoded);
98 }
99
100 #[test]
101 fn test_encode_decode_large_run_with_ff() {
102 let mut data = vec![0; 300];
103 data[100] = 0xFF;
104 let encoded = encode(data.clone());
105 assert_eq!(encoded, vec![0xFF, 100, 0xFF, 1, 0xFF, 199]);
106 let decoded = decode(encoded);
107 assert_eq!(Ok(data), decoded);
108 }
109
110 #[test]
111 fn test_error_unexpected_eof() {
112 let data = vec![0xFF];
113 let result = decode(data);
114 assert_eq!(result, Err(DecodeError::UnexpectedEOF));
115 }
116
117 #[test]
118 fn test_error_unexpected_eof_with_zeros() {
119 let data = vec![0xFF, 25, 0xFF];
120 let result = decode(data);
121 assert_eq!(result, Err(DecodeError::UnexpectedEOF));
122 }
123
124 #[test]
125 fn test_reserved_sequence() {
126 let encoded = vec![0xFF, 0x01, 0xFF, 0x05, 2, 0xFF, 0, 0x03];
127 assert_eq!(decode(encoded), Err(DecodeError::ReservedSequence));
128 }
129}