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 fn drained(&self) -> bool {
84 match self {
85 Self::Lite(driver) => driver.drained(),
86 Self::Ietf(_) => true,
87 }
88 }
89}
90
91impl<S: crate::transport::poll::Session> State<S> {
92 fn poll(&mut self, waiter: &kio::Waiter) -> Poll<Result<(), Error>> {
93 if let Some(supervisor) = &mut self.supervisor
94 && supervisor.poll(waiter).is_ready()
95 {
96 self.supervisor = None;
97 }
98
99 if self.result.is_none() {
100 let closed = match self.protocol.poll(waiter) {
104 Poll::Ready(result) => {
105 self.result = Some(result);
106 true
107 }
108 Poll::Pending => self
109 .supervisor
110 .as_mut()
111 .is_some_and(|supervisor| supervisor.poll_drain(self.protocol.drained(), waiter)),
112 };
113 if closed
114 && let Some(supervisor) = &mut self.supervisor
115 && supervisor.poll(waiter).is_ready()
116 {
117 self.supervisor = None;
118 }
119 }
120
121 match (&self.result, &self.supervisor) {
122 (Some(result), None) => Poll::Ready(result.clone()),
123 _ => Poll::Pending,
124 }
125 }
126}
127
128impl<S: crate::transport::poll::Session> crate::time::Driver for Driver<S> {
129 fn poll(&mut self, now: Instant, waiter: &kio::Waiter) -> Result<Option<Instant>, Error> {
130 self.poll(now, waiter)
131 }
132}
133
134impl<S: crate::transport::poll::Session> std::fmt::Debug for Driver<S> {
135 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
136 f.debug_struct("Driver")
137 .field("done", &self.state.result.is_some())
138 .finish()
139 }
140}