sonet_rs/
serializer.rs

1use crate::buffer::read::SonetReadBuf;
2use crate::buffer::write::SonetWriteBuf;
3use crate::packet::{Packet, PacketRegistry};
4
5/// The Serializer & Deserializer for a pack
6pub struct Codec {
7
8    /// The packet registry
9    pub registry: PacketRegistry,
10}
11
12impl Codec {
13
14    /// Creates a new Codec instance
15    pub fn new(registry: PacketRegistry) -> Codec {
16        Codec { registry }
17    }
18
19    /// Serializes the packet object into a ReadBuffer
20    pub fn serialize(&self, packet: &Box<dyn Packet>) -> SonetReadBuf {
21        // Name of the packet
22        let name = packet.get_name();
23
24        // The types of the packet struct fields
25        let types = packet.object_type_names();
26
27        // The packet struct field values
28        let data = packet.get_values();
29
30        // New WriteBuf
31        let mut buf = SonetWriteBuf::new();
32
33        // Write the name to buffer
34        buf.write_string(&name.to_string());
35
36        // Write the values automatically
37        buf.parse_types(types, data);
38
39        // Convert WriteBuf -> ReadBuf
40        let read_buf = buf.readable();
41
42        let len = read_buf.data.len();
43
44        let mut buf = SonetWriteBuf::new();
45        
46        buf.write_int(len as u32);
47
48        buf.write_raw(read_buf.data.as_slice());
49
50        buf.readable()
51    }
52
53    /// Deserializes the ReadBuffer into a packet instance
54    pub fn deserialize(&self, buffer: &mut SonetReadBuf) -> Box<dyn Packet + Send + Sync> {
55        // Read the packet's name
56        let packet_name = buffer.read_string();
57
58        // Get the instance-creation supplier from the registry.
59        let packet_wrapper = self.registry.get(&packet_name);
60
61        // Get the packet's struct field types
62        let types = packet_wrapper.get_types();
63
64        // Read the struct field values from ReadBuf
65        let data = buffer.parse_types(types);
66
67        // Create instance with the value given
68        packet_wrapper.create_instance_box(data)
69    }
70}