1use std::fs::File;
2use std::io::{Read, BufReader};
3use std::net::{TcpStream, UdpSocket};
4use std::borrow::BorrowMut;
5
6use bytes::BytesMut;
7
8
9pub enum StreamReadResult {
18 BytesRead(usize),
19 Finished,
20 Error(String),
21}
22
23pub trait StreamRead {
24 fn read_bytes(&mut self, bytes: &mut BytesMut, num_bytes: usize) -> StreamReadResult;
25}
26
27impl StreamRead for TcpStream {
28 fn read_bytes(&mut self, bytes: &mut BytesMut, num_bytes: usize) -> StreamReadResult {
29 read_bytes_from_reader(self, bytes, num_bytes)
30 }
31}
32
33impl StreamRead for BufReader<File> {
34 fn read_bytes(&mut self, bytes: &mut BytesMut, num_bytes: usize) -> StreamReadResult {
35 let result = read_bytes_from_reader(self, bytes, num_bytes);
36
37 if let StreamReadResult::BytesRead(0) = result {
38 return StreamReadResult::Finished;
41 } else {
42 return result;
43 }
44 }
45}
46
47impl StreamRead for UdpSocket {
48 fn read_bytes(&mut self, bytes: &mut BytesMut, _num_bytes: usize) -> StreamReadResult {
49 bytes.clear();
51 match self.recv(bytes).map_err(|err| format!("Udp Socket Read Error: {}", err)) {
52 Ok(bytes_read) => {
53 return StreamReadResult::BytesRead(bytes_read);
54 },
55
56 Err(string) => {
57 return StreamReadResult::Error(string);
58 }
59 }
60 }
61}
62
63
64fn read_bytes_from_reader<R: Read>(reader: &mut R, bytes: &mut BytesMut, num_bytes: usize) -> StreamReadResult {
65 let old_len = bytes.len();
66 let new_len = old_len + num_bytes;
67
68 bytes.reserve(num_bytes);
70
71 bytes.resize(new_len, 0);
74
75 let mut_bytes: &mut [u8] = bytes.borrow_mut();
77
78 let result = reader.read(&mut mut_bytes[old_len..(old_len + num_bytes)])
80 .map_err(|err| format!("Stream Read Error: {}", err));
81
82 match result {
83 Ok(bytes_read) => {
84 bytes.truncate(old_len + bytes_read);
86 return StreamReadResult::BytesRead(bytes_read);
87 },
88
89 Err(string) => {
90 return StreamReadResult::Error(string);
91 }
92 }
93}
94