tentacli_traits/
stream_reader.rs1use std::io::Cursor;
2use async_trait::async_trait;
3use byteorder::{LittleEndian, ReadBytesExt};
4use tokio::io::{AsyncBufRead, AsyncBufReadExt, AsyncReadExt};
5
6use crate::types::errors::FieldError;
7
8#[async_trait]
9pub trait StreamReader {
10 async fn read_from<R>(stream: &mut R, dependencies: &mut Vec<u8>) -> Result<Self, FieldError>
11 where
12 Self: Sized,
13 R: AsyncBufRead + Unpin + Send;
14}
15
16#[async_trait]
17impl StreamReader for u8 {
18 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
19 where
20 Self: Sized,
21 R: AsyncBufRead + Unpin + Send,
22 {
23 stream.read_u8().await.map_err(|e| FieldError::CannotRead(e, "u8".to_string()))
24 }
25}
26
27#[async_trait]
28impl StreamReader for u16 {
29 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
30 where
31 Self: Sized,
32 R: AsyncBufRead + Unpin + Send
33 {
34 stream.read_u16_le().await.map_err(|e| FieldError::CannotRead(e, "u16".to_string()))
35 }
36
37}
38
39#[async_trait]
40impl StreamReader for u32 {
41 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
42 where
43 Self: Sized,
44 R: AsyncBufRead + Unpin + Send
45 {
46 stream.read_u32_le().await.map_err(|e| FieldError::CannotRead(e, "u32".to_string()))
47 }
48}
49
50#[async_trait]
51impl StreamReader for u64 {
52 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
53 where
54 Self: Sized,
55 R: AsyncBufRead + Unpin + Send
56 {
57 stream.read_u64_le().await.map_err(|e| FieldError::CannotRead(e, "u64".to_string()))
58 }
59}
60
61#[async_trait]
62impl StreamReader for i8 {
63 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
64 where
65 Self: Sized,
66 R: AsyncBufRead + Unpin + Send
67 {
68 stream.read_i8().await.map_err(|e| FieldError::CannotRead(e, "i8".to_string()))
69 }
70
71}
72
73#[async_trait]
74impl StreamReader for i16 {
75 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
76 where
77 Self: Sized,
78 R: AsyncBufRead + Unpin + Send
79 {
80 stream.read_i16_le().await.map_err(|e| FieldError::CannotRead(e, "i16".to_string()))
81 }
82
83}
84
85#[async_trait]
86impl StreamReader for i32 {
87 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
88 where
89 Self: Sized,
90 R: AsyncBufRead + Unpin + Send
91 {
92 stream.read_i32_le().await.map_err(|e| FieldError::CannotRead(e, "i32".to_string()))
93 }
94}
95
96#[async_trait]
97impl StreamReader for i64 {
98 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
99 where
100 Self: Sized,
101 R: AsyncBufRead + Unpin + Send
102 {
103 stream.read_i64_le().await.map_err(|e| FieldError::CannotRead(e, "i64".to_string()))
104 }
105}
106
107#[async_trait]
108impl StreamReader for f32 {
109 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
110 where
111 Self: Sized,
112 R: AsyncBufRead + Unpin + Send
113 {
114 stream.read_f32_le().await.map_err(|e| FieldError::CannotRead(e, "f32".to_string()))
115 }
116}
117
118#[async_trait]
119impl StreamReader for f64 {
120 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
121 where
122 Self: Sized,
123 R: AsyncBufRead + Unpin + Send
124 {
125 stream.read_f64_le().await.map_err(|e| FieldError::CannotRead(e, "f64".to_string()))
126 }
127}
128
129#[async_trait]
130impl StreamReader for String {
131 async fn read_from<R>(stream: &mut R, dependencies: &mut Vec<u8>) -> Result<Self, FieldError>
132 where
133 Self: Sized,
134 R: AsyncBufRead + Unpin + Send
135 {
136 let mut cursor = Cursor::new(dependencies.to_vec());
137
138 let size = match dependencies.len() {
139 1 => ReadBytesExt::read_u8(&mut cursor)
140 .map_err(|e| FieldError::CannotRead(e, format!("String u8 size")))? as usize,
141 2 => ReadBytesExt::read_u16::<LittleEndian>(&mut cursor)
142 .map_err(|e| FieldError::CannotRead(e, format!("String u16 size")))? as usize,
143 4 => ReadBytesExt::read_u32::<LittleEndian>(&mut cursor)
144 .map_err(|e| FieldError::CannotRead(e, format!("String u32 size")))? as usize,
145 _ => 0,
146 };
147
148 let buffer = if size > 0 {
149 let mut buffer = vec![0u8; size];
150 stream.read_exact(&mut buffer).await
151 .map_err(|e| FieldError::CannotRead(e, "String".to_string()))?;
152 buffer
153 } else {
154 let mut buffer = vec![];
155 stream.read_until(0, &mut buffer).await
156 .map_err(|e| FieldError::CannotRead(e, "String".to_string()))?;
157 buffer
158 };
159
160 let string = String::from_utf8(buffer)
161 .map_err(|e| FieldError::InvalidString(e, "String".to_string()))?;
162
163 Ok(string.trim_end_matches(char::from(0)).to_string())
164 }
165}
166
167#[async_trait]
168impl<const N: usize> StreamReader for [u8; N] {
169 async fn read_from<R>(stream: &mut R, _: &mut Vec<u8>) -> Result<Self, FieldError>
170 where
171 Self: Sized,
172 R: AsyncBufRead + Unpin + Send
173 {
174 let mut internal_buf = [0; N];
175 stream.read_exact(&mut internal_buf).await
176 .map_err(|e| FieldError::CannotRead(e, "[u8; N]".to_string()))?;
177 Ok(internal_buf)
178 }
179}
180
181#[async_trait]
182impl<T: StreamReader + Clone + Send> StreamReader for Vec<T> {
183 async fn read_from<R>(stream: &mut R, dependencies: &mut Vec<u8>) -> Result<Self, FieldError>
184 where
185 Self: Sized,
186 R: AsyncBufRead + Unpin + Send,
187 {
188 let mut cursor = Cursor::new(dependencies.to_vec());
189 let size = match dependencies.len() {
190 1 => ReadBytesExt::read_u8(&mut cursor)
191 .map_err(|e| FieldError::CannotRead(e, format!("Vec<T> u8 size")))? as usize,
192 2 => ReadBytesExt::read_u16::<LittleEndian>(&mut cursor)
193 .map_err(|e| FieldError::CannotRead(e, format!("Vec<T> u16 size")))? as usize,
194 _ => ReadBytesExt::read_u32::<LittleEndian>(&mut cursor)
195 .map_err(|e| FieldError::CannotRead(e, format!("Vec<T> u32 size")))? as usize,
196 };
197
198 let mut buffer: Vec<T> = vec![];
199
200 for _ in 0..size {
201 buffer.push(T::read_from(stream, dependencies).await?);
202 }
203
204 Ok(buffer)
205 }
206}