Skip to main content

iostream/io/stream_rw/
stream_reader.rs

1use super::super::Stream;
2use super::*;
3use std::error::Error;
4use {StreamError, StreamErrorKind};
5
6///reader stream struct
7pub struct StreamReader<'a> {
8    pub base_stream: &'a mut Stream,
9    endian: EndianType,
10}
11
12impl<'a> StreamReader<'a> {
13    /// from stream use LittleEndian reader integer
14    /// # Examples
15    ///```rust
16    /// use iostream::io::*;
17    /// let mut ms=MemoryStream::new();
18    /// //...write data to ms
19    /// let mut ws: StreamReader = StreamReader::from(&mut ms).unwrap();
20    /// ```
21    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    /// from stream use BigEndian reader integer
32    /// # Examples
33    ///```rust
34    /// use iostream::io::*;
35    /// let mut ms=MemoryStream::new();
36    /// //...write data to ms
37    /// let mut ws: StreamReader = StreamReader::from_big_endian(&mut ms).unwrap();
38    /// ```
39    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    /// peek the current stream next byte
51    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    ///read u8 from stream
64    pub fn read_byte(&mut self) -> Result<u8, StreamError> {
65        Ok(self.base_stream.read_byte()?)
66    }
67
68    ///read vec<u8> from stream,return read length
69    pub fn read_all(&mut self, buf: &mut Vec<u8>) -> Result<usize, StreamError> {
70        Ok(self.base_stream.read_all(buf)?)
71    }
72
73    ///read [u8] from stream,can use offset and count buff position,return read len
74    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    ///read i16 from stream,return it value
84    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    ///
105    ///read u16 from stream,return it value
106    ///
107    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    ///
128    ///read u32 from stream,return it value
129    ///
130    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    ///
153    /// read i32 from stream,return it value
154    ///
155    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    ///
178    /// read i64 from stream,return it value
179    ///
180    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    ///
203    ///read u64 from stream,return it value
204    ///
205    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    ///
228    ///read f32 from stream,return it value
229    ///
230    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    ///
248    ///read f64 from stream,return it value
249    ///
250    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    ///
268    ///  read vec<u8> from the current stream,can specify need read length to buffer
269    /// # Examples
270    ///```rust
271    ///    use iostream::io::*;
272    ///    let mut ms=MemoryStream::new();
273    ///    let data:[u8;1024]=[5;1024];
274    ///    ms.write_all(&data).unwrap();
275    ///
276    ///    ms.set_position(0).unwrap();
277    ///
278    ///    let mut rs=StreamReader::from(&mut ms).unwrap();
279    ///    let rt= rs.read_u8_array(1024).unwrap();
280    ///    assert_eq!(data[..],rt[..] );
281    /// ```
282    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    ///
329    /// read string to current stream
330    ///
331    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    ///
339    ///  read str line from current stream
340    ///
341    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                                //if windows \r\n
356                                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    ///
386    ///  read all str line from current stream
387    ///
388    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    ///
410    ///  read all data to string
411    ///
412    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}