6 #[derive(Debug, Clone)]
7 pub struct DatagramEmptyError;
9 impl Error for DatagramEmptyError {}
11 impl std::fmt::Display for DatagramEmptyError {
12 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
15 "datagram cannot be constructed when provided payload is empty"
20 pub struct ConnectDatagram {
23 data: Option<Vec<u8>>,
26 impl ConnectDatagram {
27 pub fn new(recipient: u16, data: Vec<u8>) -> Result<Self, DatagramEmptyError> {
35 Err(DatagramEmptyError)
39 pub fn version(&self) -> u8 {
43 pub fn recipient(&self) -> u16 {
47 pub fn data(&self) -> Option<&Vec<u8>> {
51 pub fn take_data(&mut self) -> Option<Vec<u8>> {
55 pub fn size(&self) -> usize {
56 let data_len = if let Some(data) = self.data() {
65 pub fn bytes(&self) -> Vec<u8> {
66 let mut bytes = Vec::with_capacity(self.size());
68 bytes.extend(&self.version.to_be_bytes());
69 bytes.extend(&self.recipient.to_be_bytes());
71 if let Some(data) = self.data() {
72 bytes.extend(data.as_slice());
78 pub fn encode(&self) -> Vec<u8> {
79 let size: u32 = (self.size()) as u32;
81 let mut bytes = Vec::from(size.to_be_bytes());
82 bytes.extend(self.bytes());
87 pub fn decode(source: &mut (dyn Read + Send + Sync)) -> anyhow::Result<Self> {
89 let mut payload_size_bytes: [u8; 4] = [0; 4];
90 source.read_exact(&mut payload_size_bytes)?;
91 let payload_size = u32::from_be_bytes(payload_size_bytes);
94 let mut payload_bytes = vec![0; payload_size as usize];
95 source.read_exact(payload_bytes.as_mut_slice())?;
98 let version_bytes = payload_bytes.remove(0);
99 let version = u8::from_be(version_bytes);
102 let mut recipient_bytes: [u8; 2] = [0; 2];
103 for i in 0..recipient_bytes.len() {
104 recipient_bytes[i] = payload_bytes.remove(0);
106 let recipient = u16::from_be_bytes(recipient_bytes);
109 let data = payload_bytes;
118 Err(anyhow::Error::from(DatagramEmptyError))
125 use crate::protocol::ConnectDatagram;
129 fn encoded_size() -> anyhow::Result<()> {
130 let mut data = Vec::new();
134 assert_eq!(5, data.len());
136 let sample = ConnectDatagram::new(1, data)?;
137 assert_eq!(7 + 5, sample.encode().len());
143 fn take_data() -> anyhow::Result<()> {
144 let mut data = Vec::new();
149 let mut sample = ConnectDatagram::new(1, data)?;
151 let taken_data = sample.take_data().unwrap();
152 assert!(sample.data().is_none());
153 assert_eq!(5, taken_data.len());
159 async fn encode_and_decode() -> anyhow::Result<()> {
160 let mut data = Vec::new();
164 assert_eq!(5, data.len());
166 let sample = ConnectDatagram::new(1, data)?;
168 let mut payload = sample.encode();
169 assert_eq!(7 + 5, payload.len());
171 let mut cursor: Cursor<&mut [u8]> = Cursor::new(payload.as_mut());
172 let sample_back_res = ConnectDatagram::decode(&mut cursor);
173 assert!(sample_back_res.is_ok());
175 let sample_back = sample_back_res.unwrap();
176 assert_eq!(sample_back.version(), 1);
177 assert_eq!(sample_back.recipient(), 1);
178 assert_eq!(sample_back.data().unwrap().len(), 5);