1#![cfg(feature = "std")]
4
5use std::io::{BufRead, BufReader, BufWriter, ErrorKind, Read, Write};
6use crate::{DataSink, DataSource, Result};
7
8impl<R: Read + ?Sized> DataSource for BufReader<R> {
9 fn available(&self) -> usize {
10 self.buffer().len()
11 }
12
13 fn request(&mut self, count: usize) -> Result<bool> {
14 if self.available() < count {
15 Ok(self.fill_buf()?.len() >= count)
16 } else {
17 Ok(true)
18 }
19 }
20
21 fn read_bytes<'a>(&mut self, buf: &'a mut [u8]) -> Result<&'a [u8]> {
22 use ErrorKind::Interrupted;
23
24 let mut count = 0;
25 loop {
26 match self.read(buf) {
27 Ok(0) => break Ok(&buf[..count]),
28 Ok(cur_count) => count += cur_count,
29 Err(err) if err.kind() == Interrupted => { }
30 Err(err) => break Err(err.into())
31 }
32 }
33 }
34
35 fn read_exact_bytes<'a>(&mut self, buf: &'a mut [u8]) -> Result<&'a [u8]> {
36 self.read_exact(buf)?;
37 Ok(buf)
38 }
39
40 #[cfg(feature = "alloc")]
41 fn read_utf8_to_end<'a>(&mut self, buf: &'a mut String) -> Result<&'a str> {
42 unsafe {
43 super::append_utf8(buf, |b|
44 Ok(self.read_to_end(b)?)
45 )
46 }
47 }
48}
49
50impl<W: Write + ?Sized> DataSink for BufWriter<W> {
51 #[inline(always)]
52 fn write_bytes(&mut self, buf: &[u8]) -> Result {
53 self.write_all(buf)?;
54 Ok(())
55 }
56}