bytebuilder/
lib.rs

1use builder::ByteBuilder;
2use reader::ByteReader;
3use traits::Byteable;
4
5use crate::traits::{Builder, Reader};
6
7pub mod traits;
8pub mod builder;
9pub mod reader;
10pub mod bits;
11
12#[cfg(test)]
13mod tests {
14    use crate::traits::{Builder, Reader};
15
16    use super::*;
17
18    #[test]
19    fn it_works() {
20        let mut bytes_in = ByteBuilder::new();
21        bytes_in.push_u8(1);
22        bytes_in.push_u16(2);
23        bytes_in.push_u32(3);
24        bytes_in.push_u64(4);
25        bytes_in.push_u128(5);
26        bytes_in.push_i8(-1);
27        bytes_in.push_i16(-2);
28        bytes_in.push_i32(-3);
29        bytes_in.push_i64(-4);
30        bytes_in.push_i128(-5);
31        bytes_in.push_f32(1.0);
32        bytes_in.push_f64(2.0);
33        bytes_in.push_bool(true);
34        bytes_in.push_len_prefixed_str("Hello World!");
35        bytes_in.push(S {
36            str: String::new(),
37            val: 1,
38        });
39
40        let bytes = &bytes_in.bytes;
41        let mut bytes_out = ByteReader::new(bytes);
42        assert_eq!(bytes_out.read_u8(), Some(1));
43        assert_eq!(bytes_out.read_u16(), Some(2));
44        assert_eq!(bytes_out.read_u32(), Some(3));
45        assert_eq!(bytes_out.read_u64(), Some(4));
46        assert_eq!(bytes_out.read_u128(), Some(5));
47        assert_eq!(bytes_out.read_i8(), Some(-1));
48        assert_eq!(bytes_out.read_i16(), Some(-2));
49        assert_eq!(bytes_out.read_i32(), Some(-3));
50        assert_eq!(bytes_out.read_i64(), Some(-4));
51        assert_eq!(bytes_out.read_i128(), Some(-5));
52        assert_eq!(bytes_out.read_f32(), Some(1.0));
53        assert_eq!(bytes_out.read_f64(), Some(2.0));
54        assert_eq!(bytes_out.read_bool(), Some(true));
55        assert_eq!(bytes_out.read_len_prefixed_str(), Some("Hello World!".to_string()));
56        assert_eq!(
57            bytes_out.read::<S>(),
58            Some(S {
59                str: String::new(),
60                val: 1
61            })
62        );
63        assert_eq!(bytes_out.remaining(), 0);
64        assert_eq!(bytes_out.read_bytes(0), Some(vec![]));
65        assert_eq!(bytes_out.read_u8(), None);
66    }
67
68    #[test]
69    fn test_len_prefixed() {
70        let mut builder = ByteBuilder::new();
71        builder.push_len_prefixed_str("Hello");
72        builder.push_len_prefixed_bytes(&[1, 2, 3]);
73
74        let bytes = &builder.bytes;
75        let mut reader = ByteReader::new(bytes);
76        assert_eq!(reader.read_len_prefixed_str(), Some("Hello".to_string()));
77        assert_eq!(reader.read_len_prefixed_bytes(), Some(vec![1, 2, 3]));
78    }
79
80    #[test]
81    fn test_bit_operations() {
82        use crate::bits::builder::BitBuilder;
83        use crate::bits::reader::BitReader;
84        
85        let mut bit_builder = BitBuilder::new();
86        bit_builder.push_u8(0b11010010);
87        bit_builder.push_u8(0b10111010);
88        
89        let bytes = bit_builder.build();
90        
91        let mut bit_reader = BitReader::new(&bytes);
92        
93        assert_eq!(bit_reader.read_bit(), Some(true));
94        assert_eq!(bit_reader.read_bit(), Some(true));
95        assert_eq!(bit_reader.read_bit(), Some(false));
96        assert_eq!(bit_reader.read_bit(), Some(true));
97        assert_eq!(bit_reader.read_bit(), Some(false));
98        assert_eq!(bit_reader.read_bit(), Some(false));
99        assert_eq!(bit_reader.read_bit(), Some(true));
100        assert_eq!(bit_reader.read_bit(), Some(false));
101        
102        assert_eq!(bit_reader.read_bit(), Some(true));
103        assert_eq!(bit_reader.read_bit(), Some(false));
104        assert_eq!(bit_reader.read_bit(), Some(true));
105        assert_eq!(bit_reader.read_bit(), Some(true));
106        assert_eq!(bit_reader.read_bit(), Some(true));
107        assert_eq!(bit_reader.read_bit(), Some(false));
108        assert_eq!(bit_reader.read_bit(), Some(true));
109        assert_eq!(bit_reader.read_bit(), Some(false));
110        
111        assert_eq!(bit_reader.read_bit(), None);
112        
113        let mut bit_reader2 = BitReader::new(&bytes);
114        assert_eq!(bit_reader2.read_u8(), Some(0b11010010));
115        assert_eq!(bit_reader2.read_u8(), Some(0b10111010));
116        assert_eq!(bit_reader2.read_u8(), None);
117        
118        let mut bit_reader3 = BitReader::new(&bytes);
119        assert_eq!(bit_reader3.remaining(), 16);
120        bit_reader3.read_bit();
121        assert_eq!(bit_reader3.remaining(), 15);
122        bit_reader3.read_u8();
123        assert_eq!(bit_reader3.remaining(), 7);
124    }
125}
126
127#[derive(Debug, PartialEq)]
128struct S {
129    pub str: String,
130    pub val: i32,
131}
132
133impl Byteable for S {
134    fn to_bytes(&self) -> Vec<u8> {
135        let mut b = ByteBuilder::new();
136        b.push_len_prefixed_str(&self.str);
137        b.push_i32(self.val);
138        b.bytes
139    }
140
141    fn from_bytes<R: Reader>(reader: &mut R) -> Option<Self> {
142        Some(Self {
143            str: reader.read_len_prefixed_str()?,
144            val: reader.read_i32()?,
145        })
146    }
147}