use std::task::Poll;
use kio::{Consumer, Producer, Waiter};
#[derive(Clone)]
pub(super) struct ConnectingProducer(#[allow(dead_code)] Producer<()>);
pub(crate) struct Connecting(Consumer<()>);
impl Connecting {
pub(super) fn new() -> (ConnectingProducer, Self) {
let producer = Producer::new(());
let consumer = producer.consume();
(ConnectingProducer(producer), Self(consumer))
}
pub(crate) fn poll_ready(&self, waiter: &Waiter) -> Poll<()> {
self.0.poll_closed(waiter)
}
pub(crate) async fn ready(&self) {
kio::wait(|waiter| self.poll_ready(waiter)).await;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ready_once_every_producer_dropped() {
let (producer, connecting) = Connecting::new();
let noop = kio::Waiter::noop();
let second = producer.clone();
assert!(
connecting.poll_ready(&noop).is_pending(),
"not ready while a producer lives"
);
drop(producer);
assert!(connecting.poll_ready(&noop).is_pending(), "still a clone outstanding");
drop(second);
assert!(
connecting.poll_ready(&noop).is_ready(),
"ready once the last producer drops"
);
}
#[test]
fn ready_when_sole_producer_dropped() {
let (producer, connecting) = Connecting::new();
drop(producer);
assert!(connecting.poll_ready(&kio::Waiter::noop()).is_ready());
}
}