use serde::{ de::{self, DeserializeOwned, SeqAccess, Visitor}, Deserialize, Deserializer, Serialize, Serializer, }; use crate::{BitSet, ClientPacket, ServerPacket, VarInt, VarIntType}; use super::{deserializer, serializer, ByteBuffer, DeserializerError}; impl Serialize for BitSet<'static> { fn serialize(&self, serializer: S) -> Result where S: Serializer, { // TODO: make this right (&self.0, self.1).serialize(serializer) } } impl Serialize for VarInt { fn serialize(&self, serializer: S) -> Result where S: Serializer, { let mut val = self.0; let mut buf: Vec = Vec::new(); for _ in 0..5 { let mut b: u8 = val as u8 & 0b01111111; val >>= 7; if val != 0 { b |= 0b10000000; } buf.push(b); if val == 0 { break; } } serializer.serialize_bytes(&buf) } } impl<'de> Deserialize<'de> for VarInt { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct VarIntVisitor; impl<'de> Visitor<'de> for VarIntVisitor { type Value = VarInt; fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { formatter.write_str("a valid VarInt encoded in a byte sequence") } fn visit_seq(self, mut seq: A) -> Result where A: SeqAccess<'de>, { let mut val = 0; for i in 0..VarInt::MAX_SIZE { if let Some(byte) = seq.next_element::()? { val |= (i32::from(byte) & 0b01111111) << (i * 7); if byte & 0b10000000 == 0 { return Ok(VarInt(val)); } } else { break; } } Err(de::Error::custom("VarInt was too large")) } } deserializer.deserialize_seq(VarIntVisitor) } } pub trait Packet { const PACKET_ID: VarIntType; } impl

ClientPacket for P where P: Packet + Serialize, { fn write(&self, bytebuf: &mut ByteBuffer) { take_mut::take(bytebuf, |bytebuf| { let mut serializer = serializer::Serializer::new(bytebuf); self.serialize(&mut serializer) .expect("Could not serialize packet"); serializer.into() }); } } impl

ServerPacket for P where P: Packet + DeserializeOwned, { fn read(bytebuf: &mut ByteBuffer) -> Result { let deserializer = deserializer::Deserializer::new(bytebuf); P::deserialize(deserializer) } }