Using the impl
keyword I know that it's possible to pass a Stream
argument as parameter into an async
non-trait function. However impl <Trait>
is not possible for an argument in an async
function. Anyone any idea how this could be done? Thanks.
Can you show an example that you wish compiled?
Failing example:
use async_trait::async_trait;
use tokio::*;
#[async_trait]
pub trait HookUp
{
async fn bind<S>(&self) -> Box<S>
where
S: futures::Stream<Item = tokio::io::Result<dyn tokio::io::AsyncRead + tokio::io::AsyncWrite>>;
}
The issue has nothing to do with the async trait thing. It's just that:
- A
dyn Trait
must be in a box or behind a reference. - The
+
indyn Trait
only allows adding auto traits such asSend
. You can't combineAsyncRead
withAsyncWrite
.
The same would apply in an ordinary function.
fn foo<S>(s: S) -> S
where
S: futures::Stream<Item = Result<dyn AsyncRead + AsyncWrite>>
{
s
}
@alice Indeed, that's true; sorry for making it more complex than needs to. Do you have a suggesting how a Stream
could be passed in this case?
(In a previous situation, following your suggestion then, I was able to split
the stream in a reader
and writer
separately. In this case that's not possible).
You can make a custom trait for things that implement both?
Alternatively this might work for you?
use async_trait::async_trait;
use tokio::io::*;
#[async_trait]
pub trait HookUp {
type Stream: futures::Stream<Item = Result<Self::RW>>;
type RW: AsyncRead + AsyncWrite;
async fn bind(&self) -> Self::Stream;
}
@alice That works! Thanks so much!!
This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.