use super::H3Connection;
#[cfg(feature = "unstable")]
use {
crate::h3::H3Settings,
event_listener::EventListener,
std::{
future::Future,
pin::Pin,
task::{Context, Poll},
},
};
#[cfg(feature = "unstable")]
#[must_use = "futures do nothing unless awaited"]
#[derive(Debug)]
pub struct PeerSettingsReady<'a>(
pub(super) &'a H3Connection,
pub(super) Option<EventListener>,
);
#[cfg(feature = "unstable")]
impl Future for PeerSettingsReady<'_> {
type Output = Option<H3Settings>;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let Self(connection, listener) = &mut *self;
loop {
if let Some(snapshot) = connection.peer_settings.get().copied() {
return Poll::Ready(Some(snapshot));
}
if !connection.swansong.state().is_running() {
return Poll::Ready(None);
}
let l = if let Some(l) = listener {
l
} else {
let l = listener.insert(connection.peer_settings_event.listen());
if let Some(snapshot) = connection.peer_settings.get().copied() {
return Poll::Ready(Some(snapshot));
}
if !connection.swansong.state().is_running() {
return Poll::Ready(None);
}
l
};
std::task::ready!(Pin::new(l).poll(cx));
*listener = None;
}
}
}
impl H3Connection {
#[cfg(feature = "unstable")]
pub fn peer_settings_ready(&self) -> PeerSettingsReady<'_> {
PeerSettingsReady(self, None)
}
pub(super) fn wake_peer_settings_waiters(&self) {
self.peer_settings_event.notify(usize::MAX);
}
}