|
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> {
|
@@ -101,10 +111,21 @@ impl<T: ?Sized> ToStd<T> {
|
101 | 111 | }
|
102 | 112 | }
|
103 | 113 |
|
104 |
| -impl<T: embedded_io::Read + ?Sized> std::io::Read for ToStd<T> { |
| 114 | +impl<T: embedded_io::Read + ?Sized> std::io::Read for ToStd<T> |
| 115 | +where |
| 116 | + T::Error: Into<std::io::Error>, |
| 117 | +{ |
105 | 118 | fn read(&mut self, buf: &mut [u8]) -> Result<usize, std::io::Error> {
|
106 | 119 | self.inner.read(buf).map_err(to_std_error)
|
107 | 120 | }
|
| 121 | + |
| 122 | + fn read_exact(&mut self, buf: &mut [u8]) -> std::io::Result<()> { |
| 123 | + match self.inner.read_exact(buf) { |
| 124 | + Ok(()) => Ok(()), |
| 125 | + Err(ReadExactError::UnexpectedEof) => Err(std::io::ErrorKind::UnexpectedEof.into()), |
| 126 | + Err(ReadExactError::Other(other)) => Err(other.into()), |
| 127 | + } |
| 128 | + } |
108 | 129 | }
|
109 | 130 |
|
110 | 131 | impl<T: embedded_io::Write + ?Sized> std::io::Write for ToStd<T> {
|
|
0 commit comments