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}