use crate::buffer::read::SonetReadBuf;
use crate::buffer::write::SonetWriteBuf;
use crate::packet::{Packet, PacketRegistry};
pub struct Codec {
pub registry: PacketRegistry,
}
impl Codec {
pub fn new(registry: PacketRegistry) -> Codec {
Codec { registry }
}
pub fn serialize(&self, packet: &Box<dyn Packet>) -> SonetReadBuf {
let name = packet.get_name();
let types = packet.object_type_names();
let data = packet.get_values();
let mut buf = SonetWriteBuf::new();
buf.write_string(&name.to_string());
buf.parse_types(types, data);
let read_buf = buf.readable();
let len = read_buf.data.len();
let mut buf = SonetWriteBuf::new();
buf.write_int(len as u32);
buf.write_raw(read_buf.data.as_slice());
buf.readable()
}
pub fn deserialize(&self, buffer: &mut SonetReadBuf) -> Box<dyn Packet + Send + Sync> {
let packet_name = buffer.read_string();
let packet_wrapper = self.registry.get(&packet_name);
let types = packet_wrapper.get_types();
let data = buffer.parse_types(types);
packet_wrapper.create_instance_box(data)
}
}