use std::{ pin::Pin, task::{Context, Poll}, }; use futures::Future; use pin_project::pin_project; use tokio::sync::oneshot::{error::RecvError, Receiver}; /// Flatten a [Receiver] message in order to get rid of the [RecvError] result #[derive(Debug)] #[pin_project] pub struct FlattenedResponse { #[pin] receiver: Receiver, } impl Future for FlattenedResponse> where E: From, { type Output = Result; fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { let this = self.project(); this.receiver.poll(cx).map(|r| match r { Ok(r) => r, Err(err) => Err(err.into()), }) } } impl From> for FlattenedResponse { fn from(value: Receiver) -> Self { Self { receiver: value } } }