Skip to content

Commit 9d40f6b

Browse files
committed
Update embedded-io-adapters to swap Ok(0) for Err when required
1 parent 90e2c5e commit 9d40f6b

File tree

4 files changed

+25
-5
lines changed

4 files changed

+25
-5
lines changed

embedded-io-adapters/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## Unreleased
99

1010
- Add support for adapting `BufRead` from `futures` and `tokio`.
11+
- Return an error when a wrapped `std`/`futures`/`tokio` `write()` call returns
12+
`Ok(0)` to comply with `embedded_io::Write` requirements.
1113

1214
## 0.5.0 - 2023-08-06
1315

14-
- First release
16+
- First release

embedded-io-adapters/src/futures_03.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ impl<T: futures::io::AsyncBufRead + Unpin + ?Sized> embedded_io_async::BufRead f
5757

5858
impl<T: futures::io::AsyncWrite + Unpin + ?Sized> embedded_io_async::Write for FromFutures<T> {
5959
async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
60-
poll_fn(|cx| Pin::new(&mut self.inner).poll_write(cx, buf)).await
60+
match poll_fn(|cx| Pin::new(&mut self.inner).poll_write(cx, buf)).await {
61+
Ok(0) if !buf.is_empty() => Err(std::io::ErrorKind::WriteZero.into()),
62+
Ok(n) => Ok(n),
63+
Err(e) => Err(e),
64+
}
6165
}
6266

6367
async fn flush(&mut self) -> Result<(), Self::Error> {

embedded-io-adapters/src/std.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
//! Adapters to/from `std::io` traits.
22
3+
use embedded_io::Error;
4+
35
/// Adapter from `std::io` traits.
46
#[derive(Clone)]
57
pub struct FromStd<T: ?Sized> {
@@ -52,7 +54,11 @@ impl<T: std::io::BufRead + ?Sized> embedded_io::BufRead for FromStd<T> {
5254

5355
impl<T: std::io::Write + ?Sized> embedded_io::Write for FromStd<T> {
5456
fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
55-
self.inner.write(buf)
57+
match self.inner.write(buf) {
58+
Ok(0) if !buf.is_empty() => Err(std::io::ErrorKind::WriteZero.into()),
59+
Ok(n) => Ok(n),
60+
Err(e) => Err(e),
61+
}
5662
}
5763
fn flush(&mut self) -> Result<(), Self::Error> {
5864
self.inner.flush()
@@ -103,7 +109,11 @@ impl<T: embedded_io::Read + ?Sized> std::io::Read for ToStd<T> {
103109

104110
impl<T: embedded_io::Write + ?Sized> std::io::Write for ToStd<T> {
105111
fn write(&mut self, buf: &[u8]) -> Result<usize, std::io::Error> {
106-
self.inner.write(buf).map_err(to_std_error)
112+
match self.inner.write(buf) {
113+
Ok(n) => Ok(n),
114+
Err(e) if e.kind() == embedded_io::ErrorKind::WriteZero => Ok(0),
115+
Err(e) => Err(to_std_error(e)),
116+
}
107117
}
108118
fn flush(&mut self) -> Result<(), std::io::Error> {
109119
self.inner.flush().map_err(to_std_error)

embedded-io-adapters/src/tokio_1.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,11 @@ impl<T: tokio::io::AsyncBufRead + Unpin + ?Sized> embedded_io_async::BufRead for
6868

6969
impl<T: tokio::io::AsyncWrite + Unpin + ?Sized> embedded_io_async::Write for FromTokio<T> {
7070
async fn write(&mut self, buf: &[u8]) -> Result<usize, Self::Error> {
71-
poll_fn(|cx| Pin::new(&mut self.inner).poll_write(cx, buf)).await
71+
match poll_fn(|cx| Pin::new(&mut self.inner).poll_write(cx, buf)).await {
72+
Ok(0) if !buf.is_empty() => Err(std::io::ErrorKind::WriteZero.into()),
73+
Ok(n) => Ok(n),
74+
Err(e) => Err(e),
75+
}
7276
}
7377

7478
async fn flush(&mut self) -> Result<(), Self::Error> {

0 commit comments

Comments
 (0)