|
1 | 1 | //! Adapters to/from `std::io` traits. |
2 | 2 |
|
3 | | -use embedded_io::Error as _; |
| 3 | +use embedded_io::{Error as _, ReadExactError}; |
4 | 4 |
|
5 | 5 | /// Adapter from `std::io` traits. |
6 | 6 | #[derive(Clone)] |
@@ -40,6 +40,16 @@ impl<T: std::io::Read + ?Sized> embedded_io::Read for FromStd<T> { |
40 | 40 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> { |
41 | 41 | self.inner.read(buf) |
42 | 42 | } |
| 43 | + |
| 44 | + fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), ReadExactError<Self::Error>> { |
| 45 | + match self.inner.read_exact(buf) { |
| 46 | + Ok(()) => Ok(()), |
| 47 | + Err(error) if error.kind() == std::io::ErrorKind::UnexpectedEof => { |
| 48 | + Err(embedded_io::ReadExactError::UnexpectedEof) |
| 49 | + } |
| 50 | + Err(error) => Err(error.into()), |
| 51 | + } |
| 52 | + } |
43 | 53 | } |
44 | 54 |
|
45 | 55 | impl<T: std::io::BufRead + ?Sized> embedded_io::BufRead for FromStd<T> { |
@@ -105,6 +115,17 @@ impl<T: embedded_io::Read + ?Sized> std::io::Read for ToStd<T> { |
105 | 115 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, std::io::Error> { |
106 | 116 | self.inner.read(buf).map_err(to_std_error) |
107 | 117 | } |
| 118 | + |
| 119 | + fn read_exact(&mut self, buf: &mut [u8]) -> std::io::Result<()> { |
| 120 | + match self.inner.read_exact(buf) { |
| 121 | + Ok(()) => Ok(()), |
| 122 | + Err(e @ ReadExactError::UnexpectedEof) => Err(std::io::Error::new( |
| 123 | + std::io::ErrorKind::UnexpectedEof, |
| 124 | + format!("{e:?}"), |
| 125 | + )), |
| 126 | + Err(ReadExactError::Other(e)) => Err(to_std_error(e)), |
| 127 | + } |
| 128 | + } |
108 | 129 | } |
109 | 130 |
|
110 | 131 | impl<T: embedded_io::Write + ?Sized> std::io::Write for ToStd<T> { |
|
0 commit comments