tentacli_traits/
stream_reader.rs

1use 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}