1use crate::{DeserializationError, SerializationError, SerializerConfig, utils::{ensure_size, get_read_size, slice, write_size}};
2
3pub fn read_string(bytes: &[u8], size_key: Option<&str>, config: &mut SerializerConfig) -> Result<String, DeserializationError> {
4 let len = get_read_size(bytes, size_key, config)?;
5 config.reset_bits(true);
6 let slice = slice(config, bytes, len, true)?;
7 let string = String::from_utf8(slice.to_vec()).expect("Not valid UTF-8 bytes to create string");
8
9 Ok(string)
10}
11
12pub fn write_string(value: &str, size_key: Option<&str>, buffer: &mut Vec<u8>, config: &mut SerializerConfig) -> Result<(), SerializationError> {
13 config.reset_bits(false);
14 write_size(value.len(), size_key, buffer, config)?;
15
16 buffer.extend_from_slice(&value.as_bytes());
17 config.pos += value.len();
18 Ok(())
19}
20
21pub fn read_object<T>(bytes: &[u8], size_key: Option<&str>, config: &mut SerializerConfig) -> Result<T, DeserializationError>
22 where T : crate::BinaryDeserializer
23{
24 let len = get_read_size(bytes, size_key, config)?;
25
26 if ensure_size(config, bytes, len)? {
28 T::from_bytes(bytes, Some(config))
29 } else {
30 config.reset_bits(true);
32 let mut temp_config = config.clone();
33 temp_config.reset();
34
35 let slice = slice(config, bytes, len, true)?;
36 T::from_bytes(&slice, Some(&mut temp_config))
37 }
38}
39
40pub fn write_object<T>(value: &T, size_key: Option<&str>, buffer: &mut Vec<u8>, config: &mut SerializerConfig) -> Result<(), SerializationError>
41 where T : crate::BinarySerializer
42{
43 if size_key.is_some() {
46 let mut temp_buffer = Vec::new();
47 config.reset_bits(false);
48 value.write_bytes(&mut temp_buffer, Some(config))?;
49 write_size(temp_buffer.len(), size_key, buffer, config)?;
50 buffer.extend_from_slice(&temp_buffer);
51 Ok(())
52 } else {
53 value.write_bytes(buffer, Some(config))
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use crate::{BinaryDeserializer, dynamics::read_small_dynamic_unsigned, fixed_int::FixedInt};
60
61 use super::*;
62
63 struct TestObj {
64 nr: u16
65 }
66
67 impl BinaryDeserializer for TestObj {
68 fn from_bytes(bytes: &[u8], config: Option<&mut SerializerConfig>) -> Result<Self, DeserializationError> {
69 let config = config.unwrap();
70 let nr = FixedInt::read(bytes, config)?;
71 Ok(TestObj { nr })
72 }
73 }
74
75 #[test]
76 fn test_read_number_object_after_reading_few_bits() {
77 let bytes = vec![0b0000_0011, 0, 7];
78 let mut config = SerializerConfig::new();
79
80 let small_nr = read_small_dynamic_unsigned(&bytes, &mut config, 2).unwrap();
81 assert_eq!(small_nr, 3);
82 assert_eq!(config.bits, 2);
83 assert_eq!(config.pos, 0);
84
85 let obj = read_object::<TestObj>(&bytes, None, &mut config).unwrap();
86 assert_eq!(obj.nr, 7);
87 assert_eq!(config.bits, 0);
88 assert_eq!(config.pos, 3);
89 }
90}