1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use std::io::{ErrorKind, Read, Result, Write};
pub trait ReadWritePipe: Write {
fn write_reader<R: Read>(&mut self, mut r: R) -> Result<usize> {
let ret;
let mut bytes_written = 0;
let mut buffer = [0; 1024];
loop {
match r.read(&mut buffer[..]) {
Ok(0) => {
ret = Ok(bytes_written);
break;
}
Ok(n) => {
self.write_all(&buffer[0..n])?;
bytes_written += n;
}
Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
Err(e) => {
ret = Err(e);
break;
}
}
}
ret
}
}
impl<W: Write> ReadWritePipe for W {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn writes_all_bytes_from_reader_into_writer() {
let reader = b"a small little text";
let mut writer: Vec<u8> = Vec::new();
let size = writer.write_reader(reader as &[u8]).unwrap();
assert_eq!(size, 19);
let mut expected_result: Vec<u8> = Vec::new();
expected_result.write_all(b"a small little text").unwrap();
assert_eq!(writer, expected_result);
}
}