rocket/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/// use rocket::response::stream::One;
18/// use rocket::futures::stream::StreamExt;
19///
20/// # rocket::async_test(async {
21/// let mut stream = One::from("hello!");
22/// let values: Vec<_> = stream.collect().await;
23/// assert_eq!(values, ["hello!"]);
24/// # });
25/// ```
26pub struct One<T: Unpin>(Option<T>);
27
28/// Returns a `One` stream that will yield `value` exactly once.
29///
30/// # Example
31///
32/// ```rust
33/// use rocket::response::stream::One;
34///
35/// let mut stream = One::from("hello!");
36/// ```
37impl<T: Unpin> From<T> for One<T> {
38 fn from(value: T) -> Self {
39 One(Some(value))
40 }
41}
42
43impl<T: Unpin> Stream for One<T> {
44 type Item = T;
45
46 fn poll_next(
47 mut self: Pin<&mut Self>,
48 _: &mut Context<'_>,
49 ) -> Poll<Option<Self::Item>> {
50 Poll::Ready(self.0.take())
51 }
52}