rmw_bytes/
lib.rs

1use anyhow::Result;
2use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};
3
4pub trait Bytes {
5  fn encode(&self) -> Box<[u8]>;
6  fn decode(buf: &[u8]) -> Result<Self>
7  where
8    Self: Sized;
9}
10
11impl Bytes for bool {
12  fn encode(&self) -> Box<[u8]> {
13    ([if *self { '1' } else { '0' } as u8]).into()
14  }
15
16  fn decode(buf: &[u8]) -> Result<Self> {
17    if let Some(i) = buf.iter().next() {
18      if *i == b'0' {
19        return Ok(false);
20      }
21      return Ok(true);
22    }
23    Ok(true)
24  }
25}
26
27impl Bytes for u16 {
28  fn encode(&self) -> Box<[u8]> {
29    self.to_le_bytes().into()
30  }
31
32  fn decode(buf: &[u8]) -> Result<Self> {
33    Ok(u16::from_le_bytes(buf[..2].try_into()?))
34  }
35}
36
37impl Bytes for SocketAddrV4 {
38  fn encode(&self) -> Box<[u8]> {
39    let o = self.ip().octets();
40    let p = self.port().to_le_bytes();
41    [o[0], o[1], o[2], o[3], p[0], p[1]].into()
42  }
43  fn decode(buf: &[u8]) -> Result<Self> {
44    let li: [u8; 6] = buf.try_into()?;
45
46    Ok(Self::new(
47      [li[0], li[1], li[2], li[3]].into(),
48      u16::from_le_bytes([li[4], li[5]]),
49    ))
50  }
51}
52
53impl Bytes for SocketAddrV6 {
54  fn encode(&self) -> Box<[u8]> {
55    let o = self.ip().octets();
56    let p = self.port().to_le_bytes();
57    [
58      o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7], o[8], o[9], o[10], o[11], o[12], o[13],
59      o[14], o[15], p[0], p[1],
60    ]
61    .into()
62  }
63  fn decode(buf: &[u8]) -> Result<Self> {
64    let o: [u8; 18] = buf.try_into()?;
65    Ok(Self::new(
66      [
67        o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7], o[8], o[9], o[10], o[11], o[12], o[13],
68        o[14], o[15],
69      ]
70      .into(),
71      u16::from_le_bytes([o[16], o[17]]),
72      0,
73      0,
74    ))
75  }
76}
77
78impl Bytes for SocketAddr {
79  fn encode(&self) -> Box<[u8]> {
80    match self {
81      SocketAddr::V4(addr) => addr.encode(),
82      SocketAddr::V6(addr) => addr.encode(),
83    }
84  }
85  fn decode(buf: &[u8]) -> Result<Self> {
86    Ok(if buf.len() == 18 {
87      SocketAddr::V6(SocketAddrV6::decode(buf)?)
88    } else {
89      SocketAddr::V4(SocketAddrV4::decode(buf)?)
90    })
91  }
92}