chiark / gitweb /
packetframe: Introduce Fuse::with
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 15 Apr 2021 00:59:58 +0000 (01:59 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 23 Apr 2021 18:32:07 +0000 (19:32 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/packetframe.rs

index 95b5d18e4aa981f159b76607c1d37be383bed3a5..920916a821c70d065a6aa15ff67520d90387669f 100644 (file)
@@ -49,13 +49,13 @@ impl<RW> Fuse<RW> {
   fn get(&mut self) -> &mut RW {
     self.0.as_mut().map_err(|broken| broken.clone())?
   }
-}
 
-impl<R:Read> Read for Fuse<R> {
   #[throws(io::Error)]
-  fn read(&mut self, buf: &mut [u8]) -> usize {
+  fn with<F,T>(&mut self, f: F) -> T
+    where F: FnOnce(&mut RW) -> Result<T, io::Error>
+  {
     let inner = self.get()?;
-    let r = inner.read(buf);
+    let r = f(inner);
     if let Err(e) = &r {
       self.0 = Err(Broken {
         msg: e.to_string(),
@@ -66,6 +66,13 @@ impl<R:Read> Read for Fuse<R> {
   }
 }
 
+impl<R:Read> Read for Fuse<R> {
+  #[throws(io::Error)]
+  fn read(&mut self, buf: &mut [u8]) -> usize {
+    self.with(|inner| inner.read(buf))?
+  }
+}
+
 impl From<Broken> for io::Error {
   fn from(broken: Broken) -> io::Error {
     io::Error::new(broken.kind, broken)