embedded_io/impls/
vec_deque.rs1use core::convert::Infallible;
4
5use alloc::collections::vec_deque::VecDeque;
6
7use crate::{BufRead, ErrorType, Read, ReadExactError, ReadReady, Write, WriteReady};
8
9#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
10impl ErrorType for VecDeque<u8> {
11 type Error = Infallible;
12}
13
14#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
16impl Read for VecDeque<u8> {
17 #[inline]
21 fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
22 let (ref mut front, _) = self.as_slices();
23 let n = Read::read(front, buf)?;
24 self.drain(..n);
25 Ok(n)
26 }
27
28 #[inline]
29 fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), ReadExactError<Self::Error>> {
30 let (front, back) = self.as_slices();
31
32 match buf.split_at_mut_checked(front.len()) {
35 None => buf.copy_from_slice(&front[..buf.len()]),
36 Some((buf_front, buf_back)) => match back.split_at_checked(buf_back.len()) {
37 Some((back, _)) => {
38 buf_front.copy_from_slice(front);
39 buf_back.copy_from_slice(back);
40 }
41 None => {
42 self.clear();
43 return Err(ReadExactError::UnexpectedEof);
44 }
45 },
46 }
47
48 self.drain(..buf.len());
49 Ok(())
50 }
51}
52
53#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
55impl BufRead for VecDeque<u8> {
56 #[inline]
60 fn fill_buf(&mut self) -> Result<&[u8], Self::Error> {
61 let (front, _) = self.as_slices();
62 Ok(front)
63 }
64
65 #[inline]
66 fn consume(&mut self, amt: usize) {
67 self.drain(..amt);
68 }
69}
70
71#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
73impl Write for VecDeque<u8> {
74 #[inline]
75 fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
76 self.extend(buf);
77 Ok(buf.len())
78 }
79
80 #[inline]
81 fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
82 self.extend(buf);
83 Ok(())
84 }
85
86 #[inline]
87 fn flush(&mut self) -> Result<(), Self::Error> {
88 Ok(())
89 }
90}
91
92#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
93impl ReadReady for VecDeque<u8> {
94 #[inline]
95 fn read_ready(&mut self) -> Result<bool, Self::Error> {
96 Ok(true)
97 }
98}
99
100#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
101impl WriteReady for VecDeque<u8> {
102 #[inline]
103 fn write_ready(&mut self) -> Result<bool, Self::Error> {
104 Ok(true)
105 }
106}