diff --git a/src/client.rs b/src/client.rs index 70865ab..b9ff7d3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -34,49 +34,54 @@ impl App { } pub(crate) fn poll_run(&mut self, cx: &mut Context<'_>) -> Poll> { + match self.step(cx) { + Ok(()) => Poll::Pending, + Err(err) => Poll::Ready(Err(err)), + } + } + + fn step(&mut self, cx: &mut Context<'_>) -> Result<()> { let mut stream = pin!(&mut self.stream); match <_ as futures_sink::Sink>::poll_ready(stream.as_mut(), cx) { Poll::Pending => {} - Poll::Ready(Err(err)) => { - return Poll::Ready( - Err(err).context("Can't check network write half for readiness"), - ); - } - Poll::Ready(Ok(())) => { + Poll::Ready(result) => { + result?; if let Some(frame) = self.client.poll_send() { - if let Err(err) = stream.as_mut().start_send(frame) { - return Poll::Ready(Err(err).context("stream.start_send")); - } + stream + .as_mut() + .start_send(frame) + .context("stream.start_send")?; tracing::debug!("Started send"); } match <_ as futures_sink::Sink>::poll_flush(stream.as_mut(), cx) { Poll::Pending => {} - Poll::Ready(Err(err)) => return Poll::Ready(Err(err).context("poll_flush")), - Poll::Ready(Ok(())) => {} + Poll::Ready(result) => { + result.context("poll_flush")?; + } } } } match stream.as_mut().poll_next(cx) { Poll::Pending => {} - Poll::Ready(None) => return Poll::Ready(Err(anyhow!("Server closed cxn"))), - Poll::Ready(Some(frame)) => { + Poll::Ready(frame_opt) => { + let frame = frame_opt.context("Server closed cxn")?; cx.waker().wake_by_ref(); let frame = frame.context("network framing decode")?; - if let Err(err) = self.client.handle_frame(frame.into()) { - return Poll::Ready(Err(err).context("client.handle_frame")); - } + self.client + .handle_frame(frame.into()) + .context("client.handle_frame")?; } } if self.timer.poll_tick(cx).is_ready() { cx.waker().wake_by_ref(); - if let Err(err) = self.client.handle_timeout() { - return Poll::Ready(Err(err).context("client.handle_timeout")); - } + self.client + .handle_timeout() + .context("client.handle_timeout")?; } - Poll::Pending + Ok(()) } }