1use super::{ReadBuffer, WriteBuffer};
2use crate::IoBuffer;
3use std::io::{self, Read, Write};
4
5impl<P: Write> WriteBuffer for IoBuffer<P> {
6 type Error = io::Error;
7
8 fn alloc(&mut self) -> Result<(), Self::Error> {
9 let n = self.buffer.vacant_len();
10 if n > 0 {
11 self.buffer.advance(n);
12 }
13 Ok(())
14 }
15 fn write_all(&mut self, count: usize) -> Result<(), Self::Error> {
16 assert!(!self.poisoned);
17 let mut pos = 0;
18 while pos < count {
19 match self.pipe.write(&self.buffer.occupied()[pos..count]) {
20 Ok(n) => {
21 if n == 0 {
22 if pos != 0 {
23 self.poisoned = true;
24 }
25 return Err(io::ErrorKind::BrokenPipe.into());
26 } else {
27 pos += n;
28 }
29 }
30 Err(e) => {
31 if pos != 0 {
32 self.poisoned = true;
33 return Err(e);
34 }
35 }
36 }
37 }
38 self.buffer.clear();
39 Ok(())
40 }
41}
42
43impl<P: Read> ReadBuffer for IoBuffer<P> {
44 type Error = io::Error;
45
46 fn read(&mut self) -> Result<usize, Self::Error> {
47 assert!(!self.poisoned);
48 if self.buffer.vacant_len() == 0 {
49 if self.buffer.preceding_len() > 0 {
50 self.buffer.make_contiguous();
51 } else {
52 return Err(io::ErrorKind::OutOfMemory.into());
53 }
54 }
55 let res = self.pipe.read(self.buffer.vacant_mut());
56 if let Ok(n) = res {
57 self.buffer.advance(n);
58 }
59 res
60 }
61
62 fn skip(&mut self, count: usize) {
63 self.buffer.skip(count);
64 }
65}