data_streams/
std_io.rs

1// SPDX-License-Identifier: Apache-2.0
2
3#![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}