utils_rs/
lib.rs

1use std::io;
2
3
4pub trait ReadTrait {
5    fn read_vec(&mut self, size: isize) -> Result<Vec<u8>, std::io::Error>;
6}
7
8impl<R: io::Read> ReadTrait for R {
9    fn read_vec(&mut self, size: isize) -> Result<Vec<u8>, std::io::Error> {
10        let mut vec:Vec<u8> = Vec::new();
11        if size < 0 {
12            self.read_to_end(&mut vec)?;
13            }
14        else if size > 0 {
15            vec = Vec::with_capacity(size as usize);
16            unsafe {vec.set_len(size as usize);}
17            let mut buf = &mut vec[..];
18            let mut readed = 0;
19            while !buf.is_empty() {
20                match self.read(buf) {
21                    Ok(0) => break,
22                    Ok(n) => {
23                        readed += n;
24                        let tmp = buf;
25                        buf = &mut tmp[n..];
26                        }
27                    Err(e) => return Err(e),
28                    }
29                }
30            unsafe {vec.set_len(readed);}
31            }
32        return Ok(vec);
33    }
34}