iostream/io/stream_rw/
stream_reader.rs1use super::super::Stream;
2use super::*;
3use std::error::Error;
4use {StreamError, StreamErrorKind};
5
6pub struct StreamReader<'a> {
8 pub base_stream: &'a mut Stream,
9 endian: EndianType,
10}
11
12impl<'a> StreamReader<'a> {
13 pub fn from(stream: &'a mut Stream) -> Result<StreamReader<'a>, String> {
22 if !stream.can_read() {
23 return Err("the stream not can read".to_string());
24 }
25
26 Ok(StreamReader {
27 base_stream: stream,
28 endian: EndianType::LittleEndian,
29 })
30 }
31 pub fn from_big_endian(stream: &'a mut Stream) -> Result<StreamReader<'a>, String> {
40 if !stream.can_read() {
41 return Err("the stream not can read".to_string());
42 }
43
44 Ok(StreamReader {
45 base_stream: stream,
46 endian: EndianType::BigEndian,
47 })
48 }
49
50 pub fn peek(&mut self) -> Result<u8, StreamError> {
52 let d = self.base_stream.read_byte()?;
53 let p = self.base_stream.position() - 1;
54 let r = self.base_stream.set_position(p);
55
56 if let Err(e) = r {
57 StreamError::from_str(&format!("{}", e))?
58 }
59
60 Ok(d)
61 }
62
63 pub fn read_byte(&mut self) -> Result<u8, StreamError> {
65 Ok(self.base_stream.read_byte()?)
66 }
67
68 pub fn read_all(&mut self, buf: &mut Vec<u8>) -> Result<usize, StreamError> {
70 Ok(self.base_stream.read_all(buf)?)
71 }
72
73 pub fn read(
75 &mut self,
76 buf: &mut [u8],
77 offset: usize,
78 count: usize,
79 ) -> Result<usize, StreamError> {
80 Ok(self.base_stream.read(buf, offset, count)?)
81 }
82
83 pub fn read_i16(&mut self) -> Result<i16, StreamError> {
85 let mut data: [u8; 2] = [0; 2];
86 let r = self.read(&mut data, 0, 2)?;
87
88 if r == 2 {
89 let result: i16 = (data[0] as i16 | ((data[1] as i16) << 8)) as i16;
90
91 if let EndianType::BigEndian = self.endian {
92 let result = swap_i16(&result);
93 Ok(result)
94 } else {
95 Ok(result)
96 }
97 } else {
98 panic!(format!(
99 "read length error for i16,need length 2,read length {}",
100 r
101 ))
102 }
103 }
104 pub fn read_u16(&mut self) -> Result<u16, StreamError> {
108 let mut data: [u8; 2] = [0; 2];
109 let r = self.read(&mut data, 0, 2)?;
110
111 if r == 2 {
112 let result: u16 = (data[0] as u16 | ((data[1] as u16) << 8)) as u16;
113 if let EndianType::BigEndian = self.endian {
114 let result = swap_u16(&result);
115 Ok(result)
116 } else {
117 Ok(result)
118 }
119 } else {
120 panic!(format!(
121 "read length error for u16,need length 2,read length {}",
122 r
123 ))
124 }
125 }
126
127 pub fn read_u32(&mut self) -> Result<u32, StreamError> {
131 let mut data: [u8; 4] = [0; 4];
132 let r = self.read(&mut data, 0, 4)?;
133
134 if r == 4 {
135 unsafe {
136 let result: u32 = *(data.as_ptr() as *const u32);
137 if let EndianType::BigEndian = self.endian {
138 let result = swap_u32(&result);
139 Ok(result)
140 } else {
141 Ok(result)
142 }
143 }
144 } else {
145 panic!(format!(
146 "read length error for u32,need length 4,read length {}",
147 r
148 ))
149 }
150 }
151
152 pub fn read_i32(&mut self) -> Result<i32, StreamError> {
156 let mut data: [u8; 4] = [0; 4];
157 let r = self.read(&mut data, 0, 4)?;
158
159 if r == 4 {
160 unsafe {
161 let result: i32 = *(data.as_ptr() as *const i32);
162 if let EndianType::BigEndian = self.endian {
163 let result = swap_i32(&result);
164 Ok(result)
165 } else {
166 Ok(result)
167 }
168 }
169 } else {
170 panic!(format!(
171 "read length error for i32,need length 4,read length {}",
172 r
173 ))
174 }
175 }
176
177 pub fn read_i64(&mut self) -> Result<i64, StreamError> {
181 let mut data: [u8; 8] = [0; 8];
182 let r = self.read(&mut data, 0, 8)?;
183
184 if r == 8 {
185 unsafe {
186 let result: i64 = *(data.as_ptr() as *const i64);
187 if let EndianType::BigEndian = self.endian {
188 let result = swap_i64(&result);
189 Ok(result)
190 } else {
191 Ok(result)
192 }
193 }
194 } else {
195 panic!(format!(
196 "read length error for i64,need length 8,read length {}",
197 r
198 ))
199 }
200 }
201
202 pub fn read_u64(&mut self) -> Result<u64, StreamError> {
206 let mut data: [u8; 8] = [0; 8];
207 let r = self.read(&mut data, 0, 8)?;
208
209 if r == 8 {
210 unsafe {
211 let result: u64 = *(data.as_ptr() as *const u64);
212 if let EndianType::BigEndian = self.endian {
213 let result = swap_u64(&result);
214 Ok(result)
215 } else {
216 Ok(result)
217 }
218 }
219 } else {
220 panic!(format!(
221 "read length error for u64,need length 8,read length {}",
222 r
223 ))
224 }
225 }
226
227 pub fn read_single(&mut self) -> Result<f32, StreamError> {
231 let mut data: [u8; 4] = [0; 4];
232 let r = self.read(&mut data, 0, 4)?;
233
234 if r == 4 {
235 unsafe {
236 let result: f32 = *(data.as_ptr() as *const f32);
237 Ok(result)
238 }
239 } else {
240 panic!(format!(
241 "read length error for f32,need length 4,read length {}",
242 r
243 ))
244 }
245 }
246
247 pub fn read_double(&mut self) -> Result<f64, StreamError> {
251 let mut data: [u8; 8] = [0; 8];
252 let r = self.read(&mut data, 0, 8)?;
253
254 if r == 8 {
255 unsafe {
256 let result: f64 = *(data.as_ptr() as *const f64);
257 Ok(result)
258 }
259 } else {
260 panic!(format!(
261 "read length error for f64,need length 8,read length {}",
262 r
263 ))
264 }
265 }
266
267 pub fn read_u8_array(&mut self, len: u32) -> Result<Vec<u8>, StreamError> {
283 let mut array: Vec<u8> = Vec::new();
284 for _i in 0..len {
285 let v = self.read_byte();
286
287 match v {
288 Ok(i) => {
289 array.push(i);
290 }
291 Err(e) => {
292 if let StreamErrorKind::End = e.err_type {
293 break;
294 } else {
295 return Err(e);
296 }
297 }
298 }
299 }
300 Ok(array)
301 }
302
303 fn read7bit_encode_to_int(&mut self) -> Result<u32, String> {
304 let mut i = 0;
305 let mut a1: u32 = 0;
306 let mut a2: u32 = 0;
307
308 loop {
309 if a1 == 0x23 {
310 return Err("bad 7 bit i32".to_string());
311 }
312 let r = self.read_byte();
313 if let Ok(v) = r {
314 i = v;
315 }
316
317 a1 |= ((i & 0x7f) << a2 as u8) as u32;
318 a2 += 7;
319
320 if i & 0x80 == 0 {
321 break;
322 }
323 }
324
325 Ok(a1)
326 }
327
328 pub fn read_string(&mut self) -> Result<String, Box<dyn Error>> {
332 let capacity: u32 = self.read7bit_encode_to_int()?;
333 let data = self.read_u8_array(capacity)?;
334 let str = String::from_utf8_lossy(&data);
335 Ok(str.to_string())
336 }
337
338 pub fn read_line(&mut self) -> Result<String, Box<dyn Error>> {
342 let mut data: Vec<u8> = Vec::new();
343
344 loop {
345 let rt = self.read_byte();
346
347 match rt {
348 Ok(i) => {
349 data.push(i);
350
351 if i == '\r' as u8 {
352 let r = self.peek();
353 if let Ok(i) = r {
354 if i == '\n' as u8 {
355 data.push(i);
357 let position = self.base_stream.position();
358 let r = self.base_stream.set_position(position + 1);
359 if let Err(e) = r {
360 StreamError::from_str(&format!("{}", e))?
361 }
362 }
363 }
364
365 break;
366 } else if i == '\n' as u8 {
367 break;
368 }
369
370 continue;
371 }
372 Err(e) => {
373 if let StreamErrorKind::End = e.err_type {
374 break;
375 } else {
376 return Err(Box::new(e));
377 }
378 }
379 }
380 }
381
382 return Ok(String::from_utf8_lossy(&data).to_string());
383 }
384
385 pub fn read_all_lines(&mut self) -> Result<Vec<String>, Box<dyn Error>> {
389 let mut list: Vec<String> = Vec::new();
390
391 loop {
392 let rt = self.peek();
393
394 if let Err(e) = rt {
395 if let StreamErrorKind::End = e.err_type {
396 break;
397 } else {
398 return Err(Box::new(e));
399 }
400 } else if let Ok(_i) = rt {
401 let str = self.read_line()?;
402 list.push(str);
403 }
404 }
405
406 return Ok(list);
407 }
408
409 pub fn read_all_text(&mut self) -> Result<String, Box<dyn Error>> {
413 let mut data: Vec<u8> = Vec::new();
414 let size = self.read_all(&mut data)?;
415
416 if size > 0 {
417 Ok(String::from_utf8_lossy(&data).to_string())
418 } else {
419 Err(Box::new(StreamError::new_bad()))
420 }
421 }
422}