1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::pin::Pin;
use std::task::{Context, Poll};
use futures::future::Future;
use futures::stream::Stream;
use futures::{AsyncRead};
use capnp::{Error, message};
async fn read_next_message<R>(mut reader: R, options: message::ReaderOptions)
-> Result<(R, Option<message::Reader<capnp::serialize::OwnedSegments>>), Error>
where R: AsyncRead + Unpin
{
let m = crate::serialize::try_read_message(&mut reader, options).await?;
Ok((reader, m))
}
#[must_use = "streams do nothing unless polled"]
pub struct ReadStream<'a, R> where R: AsyncRead + Unpin {
options: message::ReaderOptions,
read: Pin<Box<dyn Future<Output=Result<(R, Option<message::Reader<capnp::serialize::OwnedSegments>>), Error>> + 'a >>,
}
impl <'a, R> Unpin for ReadStream<'a, R> where R: AsyncRead + Unpin {}
impl <'a, R> ReadStream<'a, R> where R: AsyncRead + Unpin + 'a {
pub fn new(reader: R, options: message::ReaderOptions) -> Self
{
ReadStream {
read: Box::pin(read_next_message(reader, options)),
options: options,
}
}
}
impl <'a, R> Stream for ReadStream<'a, R> where R: AsyncRead + Unpin + 'a {
type Item = Result<message::Reader<capnp::serialize::OwnedSegments>, Error>;
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> {
let (r, m) = match Future::poll(self.read.as_mut(), cx) {
Poll::Pending => return Poll::Pending,
Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(e))),
Poll::Ready(Ok(x)) => x,
};
self.read = Box::pin(read_next_message(r, self.options));
match m {
Some(message) => Poll::Ready(Some(Ok(message))),
None => Poll::Ready(None),
}
}
}