1use crate::buffer::read::SonetReadBuf;
2use crate::buffer::write::SonetWriteBuf;
3use crate::packet::{Packet, PacketRegistry};
4
5pub struct Codec {
7
8 pub registry: PacketRegistry,
10}
11
12impl Codec {
13
14 pub fn new(registry: PacketRegistry) -> Codec {
16 Codec { registry }
17 }
18
19 pub fn serialize(&self, packet: &Box<dyn Packet>) -> SonetReadBuf {
21 let name = packet.get_name();
23
24 let types = packet.object_type_names();
26
27 let data = packet.get_values();
29
30 let mut buf = SonetWriteBuf::new();
32
33 buf.write_string(&name.to_string());
35
36 buf.parse_types(types, data);
38
39 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 pub fn deserialize(&self, buffer: &mut SonetReadBuf) -> Box<dyn Packet + Send + Sync> {
55 let packet_name = buffer.read_string();
57
58 let packet_wrapper = self.registry.get(&packet_name);
60
61 let types = packet_wrapper.get_types();
63
64 let data = buffer.parse_types(types);
66
67 packet_wrapper.create_instance_box(data)
69 }
70}