use super::*;
#[derive(Clone)]
pub struct SendHandle {
pub(crate) handle: bus::SendHandle,
}
impl SendHandle {
pub fn cancel(self) -> Result<(), SendStatus> {
let status = self.handle.0.poll();
match self.handle.0.cancel() {
bus::CancellationResult::Ok => Ok(()),
_ => Err(status),
}
}
pub fn current_status(&self) -> SendStatus {
self.handle.0.poll()
}
pub fn changed(&self) -> SendHandleFuture {
SendHandleFuture {
inner: self.clone(),
}
}
fn add_on_change(&self, callback: impl Into<Callback<bus::SendStatus>>) {
self.handle.0.set_on_change(callback.into(), true)
}
}
pub struct SendHandleFuture {
inner: SendHandle,
}
impl core::future::Future for SendHandleFuture {
type Output = bus::SendStatus;
fn poll(
self: std::pin::Pin<&mut Self>,
cx: &mut std::task::Context<'_>,
) -> std::task::Poll<Self::Output> {
let state = self.inner.handle.0.poll();
if state != SendStatus::Pending {
core::task::Poll::Ready(state)
} else {
let waker = cx.waker().clone();
self.inner
.add_on_change(Box::new(move |_| waker.wake_by_ref()));
core::task::Poll::Pending
}
}
}