summaryrefslogtreecommitdiff
path: root/shared/src/packets.rs
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/packets.rs')
-rw-r--r--shared/src/packets.rs92
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))
+ }
+}