From 822d5ad79b86b638343b1c4840595d38aa4190b3 Mon Sep 17 00:00:00 2001 From: Christian Eck Date: Wed, 19 Aug 2026 11:00:14 +0200 Subject: [PATCH 1/2] add split traits --- embedded-io-async/src/lib.rs | 12 ++++++++++++ embedded-io/src/lib.rs | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/embedded-io-async/src/lib.rs b/embedded-io-async/src/lib.rs index b90935f2..6fb97437 100644 --- a/embedded-io-async/src/lib.rs +++ b/embedded-io-async/src/lib.rs @@ -167,3 +167,15 @@ pub trait Seek: ErrorType { self.seek(SeekFrom::Current(0)).await } } + +/// Split a stream in a reader and writer, which are independent +pub trait SplitRW { + /// Reader type of the split stream + type Reader: Read; + + /// Writer type of the split stream + type Writer: Write; + + /// Split a stream in a independent reader and writer + fn split_rw(&mut self) -> (Self::Reader, Self::Writer); +} diff --git a/embedded-io/src/lib.rs b/embedded-io/src/lib.rs index daca2441..0dbfe3cd 100644 --- a/embedded-io/src/lib.rs +++ b/embedded-io/src/lib.rs @@ -566,3 +566,15 @@ pub trait WriteReady: ErrorType { /// If this returns `true`, it's guaranteed that the next call to [`Write::write`] will not block. fn write_ready(&mut self) -> Result; } + +/// Split a stream in a reader and writer, which are independent +pub trait SplitRW { + /// Reader type of the split stream + type Reader: Read; + + /// Writer type of the split stream + type Writer: Write; + + /// Split a stream in a independent reader and writer + fn split_rw(&mut self) -> (Self::Reader, Self::Writer); +} From 9379912c1188c0cf968451b1cef2ff5afda64d32 Mon Sep 17 00:00:00 2001 From: Christian Eck Date: Wed, 26 Aug 2026 09:03:04 +0200 Subject: [PATCH 2/2] correct signature to express lifetime dependencies --- embedded-io-async/src/lib.rs | 13 +++++++++---- embedded-io/src/lib.rs | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/embedded-io-async/src/lib.rs b/embedded-io-async/src/lib.rs index 6fb97437..573c41e7 100644 --- a/embedded-io-async/src/lib.rs +++ b/embedded-io-async/src/lib.rs @@ -169,13 +169,18 @@ pub trait Seek: ErrorType { } /// Split a stream in a reader and writer, which are independent -pub trait SplitRW { +pub trait SplitRW: ErrorType { /// Reader type of the split stream - type Reader: Read; + type Reader<'a>: Read + where + Self: 'a; /// Writer type of the split stream - type Writer: Write; + type Writer<'a>: Write + where + Self: 'a; /// Split a stream in a independent reader and writer - fn split_rw(&mut self) -> (Self::Reader, Self::Writer); + /// The stream is mutably borrowed, until the reader and writer are dropped. + fn split_rw<'s>(&'s mut self) -> Result<(Self::Reader<'s>, Self::Writer<'s>), Self::Error>; } diff --git a/embedded-io/src/lib.rs b/embedded-io/src/lib.rs index 0dbfe3cd..af46323a 100644 --- a/embedded-io/src/lib.rs +++ b/embedded-io/src/lib.rs @@ -568,13 +568,18 @@ pub trait WriteReady: ErrorType { } /// Split a stream in a reader and writer, which are independent -pub trait SplitRW { +pub trait SplitRW: ErrorType { /// Reader type of the split stream - type Reader: Read; + type Reader<'a>: Read + where + Self: 'a; /// Writer type of the split stream - type Writer: Write; + type Writer<'a>: Write + where + Self: 'a; /// Split a stream in a independent reader and writer - fn split_rw(&mut self) -> (Self::Reader, Self::Writer); + /// The stream is mutably borrowed, until the reader and writer are dropped. + fn split_rw<'s>(&'s mut self) -> Result<(Self::Reader<'s>, Self::Writer<'s>), Self::Error>; }