1use std::task::Poll;
4
5use crate::Error;
6use crate::time::{Clock, Instant};
7
8#[must_use = "the session makes no progress unless its driver is polled"]
21pub struct Driver<S: crate::transport::poll::Session> {
22 state: State<S>,
23 clock: Clock,
24}
25
26pub(crate) enum Protocol<S: crate::transport::poll::Session> {
35 Lite(Box<crate::lite::Driver<S>>),
37 Ietf(crate::util::MaybeSendBox<'static, Result<(), Error>>),
38}
39
40pub(crate) struct State<S: crate::transport::poll::Session> {
42 pub(crate) protocol: Protocol<S>,
43 pub(crate) supervisor: Option<crate::session::Supervisor<S>>,
51 pub(crate) result: Option<Result<(), Error>>,
53}
54
55impl<S: crate::transport::poll::Session> Driver<S> {
56 pub(crate) fn new(clock: Clock, state: State<S>) -> Self {
57 Self { state, clock }
58 }
59
60 pub fn poll(&mut self, now: Instant, waiter: &kio::Waiter) -> Result<Option<Instant>, Error> {
64 self.clock.advance(now);
65 match self.state.poll(waiter) {
66 Poll::Ready(Ok(())) => Err(Error::Closed),
67 Poll::Ready(Err(err)) => Err(err),
68 Poll::Pending => Ok(self.clock.timeout()),
69 }
70 }
71}
72
73impl<S: crate::transport::poll::Session> Protocol<S> {
74 fn poll(&mut self, waiter: &kio::Waiter) -> Poll<Result<(), Error>> {
75 match self {
76 Self::Lite(driver) => driver.poll(waiter),
77 Self::Ietf(driver) => waiter.poll_future(driver.as_mut()),
78 }
79 }
80}
81
82impl<S: crate::transport::poll::Session> State<S> {
83 fn poll(&mut self, waiter: &kio::Waiter) -> Poll<Result<(), Error>> {
84 if let Some(supervisor) = &mut self.supervisor
85 && supervisor.poll(waiter).is_ready()
86 {
87 self.supervisor = None;
88 }
89
90 if self.result.is_none()
91 && let Poll::Ready(result) = self.protocol.poll(waiter)
92 {
93 self.result = Some(result);
94 if let Some(supervisor) = &mut self.supervisor
97 && supervisor.poll(waiter).is_ready()
98 {
99 self.supervisor = None;
100 }
101 }
102
103 match (&self.result, &self.supervisor) {
104 (Some(result), None) => Poll::Ready(result.clone()),
105 _ => Poll::Pending,
106 }
107 }
108}
109
110impl<S: crate::transport::poll::Session> crate::time::Driver for Driver<S> {
111 fn poll(&mut self, now: Instant, waiter: &kio::Waiter) -> Result<Option<Instant>, Error> {
112 self.poll(now, waiter)
113 }
114}
115
116impl<S: crate::transport::poll::Session> std::fmt::Debug for Driver<S> {
117 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
118 f.debug_struct("Driver")
119 .field("done", &self.state.result.is_some())
120 .finish()
121 }
122}