From: Ian Jackson Date: Sun, 6 Sep 2020 18:04:11 +0000 (+0100) Subject: break out write_next X-Git-Tag: otter-0.2.0~995 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=a20de701b611878dca9e8fb922b77cc6274b3e8d;p=otter.git break out write_next --- diff --git a/src/sse.rs b/src/sse.rs index 1eb3cf35..82fec9e1 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -31,12 +31,32 @@ struct UpdateReader { #[error("WouldBlock error misreported!")] struct FlushWouldBlockError{} +impl UpdateReader { + #[throws(io::Error)] + fn write_next(&mut self, mut buf: &mut U, next: &PreparedUpdate) + where U : Write { + let tu = next.for_transmit(self.client); + + write!(buf, "data: ")?; + serde_json::to_writer(&mut buf, &tu)?; + write!(buf, "\n\ + id: {}\n\n", + &self.to_send)?; + + debug!("sending to {:?} {:?}: {:?}", + &self.player, &self.client, &tu); + + self.to_send.try_increment().unwrap(); + } +} + impl Read for UpdateReader { fn read(&mut self, orig_buf: &mut [u8]) -> Result { let em : fn(&'static str) -> io::Error = |s| io::Error::new(io::ErrorKind::Other, anyhow!(s)); - let mut ig = self.gref.lock().map_err(|_| em("poison"))?; + let gref = self.gref.clone(); + let mut ig = gref.lock().map_err(|_| em("poison"))?; let orig_wanted = orig_buf.len(); let mut buf = &mut *orig_buf; @@ -56,18 +76,13 @@ impl Read for UpdateReader { let next_len = UPDATE_MAX_FRAMING_SIZE + next.json_len(); if next_len > buf.len() { break } - let tu = next.for_transmit(self.client); // xxx handle overflow by allocating - write!(buf, "data: ")?; - serde_json::to_writer(&mut buf, &tu) - .map_err(|e| { error!("serde_json::to_write: {:?}", e); e })?; - write!(buf, "\n\ - id: {}\n\n", - &self.to_send)?; - self.to_send.try_increment().unwrap(); - - debug!("sending to {:?} {:?}: {:?}", - &self.player, &self.client, &tu); + self.write_next(&mut buf, &next) + .map_err(|e| { + error!("UpdateReader.write_next: {} {} {:?}", + &self.player, &self.client, e); + e + })?; }