rocket_community/response/stream/one.rs
1use std::pin::Pin;
2use std::task::{Context, Poll};
3
4use futures::stream::Stream;
5
6/// A stream that yields exactly one value.
7///
8/// A `ReaderStream` which wraps this type and yields one `AsyncRead` is
9/// returned by [`ReaderStream::one()`]. A `One` can also be constructed via
10/// [`One::from()`].
11///
12/// [`ReaderStream::one()`]: crate::response::stream::ReaderStream::one()
13///
14/// # Example
15///
16/// ```rust
17/// # extern crate rocket_community as rocket;
18/// use rocket::response::stream::One;
19/// use rocket::futures::stream::StreamExt;
20///
21/// # rocket::async_test(async {
22/// let mut stream = One::from("hello!");
23/// let values: Vec<_> = stream.collect().await;
24/// assert_eq!(values, ["hello!"]);
25/// # });
26/// ```
27pub struct One<T: Unpin>(Option<T>);
28
29/// Returns a `One` stream that will yield `value` exactly once.
30///
31/// # Example
32///
33/// ```rust
34/// # extern crate rocket_community as rocket;
35/// use rocket::response::stream::One;
36///
37/// let mut stream = One::from("hello!");
38/// ```
39impl<T: Unpin> From<T> for One<T> {
40 fn from(value: T) -> Self {
41 One(Some(value))
42 }
43}
44
45impl<T: Unpin> Stream for One<T> {
46 type Item = T;
47
48 fn poll_next(mut self: Pin<&mut Self>, _: &mut Context<'_>) -> Poll<Option<Self::Item>> {
49 Poll::Ready(self.0.take())
50 }
51}