diff options
Diffstat (limited to 'shared/src/packets.rs')
-rw-r--r-- | shared/src/packets.rs | 92 |
1 files changed, 65 insertions, 27 deletions
diff --git a/shared/src/packets.rs b/shared/src/packets.rs index 626da07..0ceed73 100644 --- a/shared/src/packets.rs +++ b/shared/src/packets.rs @@ -22,21 +22,24 @@ pub enum Packet { Sound(Object, Vec<u8>), } +pub trait ReadWrite: Sized { + fn write(&self, w: &mut dyn Write) -> Result<()>; + fn read(r: &mut dyn Read) -> Result<Self>; + + fn write_alloc(&self) -> Vec<u8> { + let mut buf = Vec::new(); + self.write(&mut buf).unwrap(); + buf + } +} + impl Object { pub fn new() -> Self { Self(rand::random()) } } - impl Packet { - pub fn serialize(&self, w: &mut impl Write) -> Result<()> { - let mut buf = Vec::new(); - self.serialize_inner(&mut buf)?; - w.write_all(&(buf.len() as u16).to_be_bytes())?; - w.write_all(&buf)?; - Ok(()) - } - pub fn serialize_inner(&self, w: &mut impl Write) -> Result<()> { + fn serialize_inner(&self, w: &mut impl Write) -> Result<()> { match self { Packet::RequestResource(resource) => { w.write_all(&[0x01])?; @@ -84,18 +87,27 @@ impl Packet { } Ok(()) } - pub fn deserialize(r: &mut impl Read) -> Result<Self> { +} +impl ReadWrite for Packet { + fn write(&self, w: &mut dyn Write) -> Result<()> { + let mut buf = Vec::new(); + self.serialize_inner(&mut buf)?; + w.write_all(&(buf.len() as u16).to_be_bytes())?; + w.write_all(&buf)?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { let mut size_tag = [0u8; 3]; r.read_exact(&mut size_tag)?; Ok(match size_tag[2] { - 0x01 => Packet::RequestResource(read_res(r)?), + 0x01 => Packet::RequestResource(Resource::read(r)?), 0x02 => Packet::RespondResource(read_data(r)?), - 0x03 => Packet::Add(Object(read_u128(r)?), read_res(r)?), + 0x03 => Packet::Add(Object(read_u128(r)?), Resource::read(r)?), 0x04 => Packet::Remove(Object(read_u128(r)?)), 0x05 => Packet::Position( Object(read_u128(r)?), - Vec3::new(read_float(r)?, read_float(r)?, read_float(r)?), - Vec3::new(read_float(r)?, read_float(r)?, read_float(r)?), + Vec3::new(f32::read(r)?, f32::read(r)?, f32::read(r)?), + Vec3::new(f32::read(r)?, f32::read(r)?, f32::read(r)?), ), 0x06 => Packet::Pose(Object(read_u128(r)?), read_params(r)?), 0x07 => Packet::Parent(Object(read_u128(r)?), Object(read_u128(r)?)), @@ -110,17 +122,23 @@ impl Packet { } } -fn read_u128(r: &mut impl Read) -> Result<u128> { +fn read_u128(r: &mut dyn Read) -> Result<u128> { let mut buf = [0; 16]; r.read_exact(&mut buf)?; Ok(u128::from_be_bytes(buf)) } -fn read_res(r: &mut impl Read) -> Result<Resource> { - let mut buf = [0; 32]; - r.read_exact(&mut buf)?; - Ok(Resource(buf)) +impl ReadWrite for Resource { + fn write(&self, w: &mut dyn Write) -> Result<()> { + w.write_all(&self.0)?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { + let mut s = Self([0; 32]); + r.read_exact(&mut s.0)?; + Ok(s) + } } -fn read_data(r: &mut impl Read) -> Result<Vec<u8>> { +fn read_data(r: &mut dyn Read) -> Result<Vec<u8>> { let mut size = [0; 2]; r.read_exact(&mut size)?; let size = u16::from_be_bytes(size); @@ -128,22 +146,29 @@ fn read_data(r: &mut impl Read) -> Result<Vec<u8>> { r.read_exact(&mut buf)?; Ok(buf) } -fn read_float(r: &mut impl Read) -> Result<f32> { - let mut buf = [0; 4]; - r.read_exact(&mut buf)?; - Ok(f32::from_be_bytes(buf)) -} -fn read_params(r: &mut impl Read) -> Result<Vec<f32>> { +fn read_params(r: &mut dyn Read) -> Result<Vec<f32>> { let mut size = [0; 2]; r.read_exact(&mut size)?; let size = u16::from_be_bytes(size); let mut v = Vec::with_capacity(size as usize); for _ in 0..size { - v.push(read_float(r)?); + v.push(f32::read(r)?); } Ok(v) } +impl ReadWrite for f32 { + fn write(&self, w: &mut dyn Write) -> Result<()> { + w.write_all(&self.to_be_bytes())?; + Ok(()) + } + fn read(r: &mut dyn Read) -> Result<Self> { + let mut buf = [0; 4]; + r.read_exact(&mut buf)?; + Ok(f32::from_be_bytes(buf)) + } +} + impl Display for Resource { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!( @@ -162,3 +187,16 @@ impl Debug for Resource { write!(f, "{}", self) } } + +impl<T: ReadWrite, const N: usize> ReadWrite for [T; N] { + fn write(&self, w: &mut dyn Write) -> Result<()> { + for e in self { + e.write(w)?; + } + Ok(()) + } + + fn read(r: &mut dyn Read) -> Result<Self> { + [(); N].try_map(|()| T::read(r)) + } +} |