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}