chiark / gitweb /
packetframe: Introduce Fuse::get
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 15 Apr 2021 00:56:03 +0000 (01:56 +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 5403c24e7f9c1d9285882c599dcb44df1baaa67a..95b5d18e4aa981f159b76607c1d37be383bed3a5 100644 (file)
@@ -44,22 +44,25 @@ pub struct Broken {
   kind: io::ErrorKind,
 }
 
+impl<RW> Fuse<RW> {
+  #[throws(io::Error)]
+  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 {
-    match &mut self.0 {
-      Err(broken) => throw!(broken.clone()),
-      Ok(inner) => {
-        let r = inner.read(buf);
-        if let Err(e) = &r {
-          self.0 = Err(Broken {
-            msg: e.to_string(),
-            kind: e.kind(),
-          });
-        }
-        r?
-      }
+    let inner = self.get()?;
+    let r = inner.read(buf);
+    if let Err(e) = &r {
+      self.0 = Err(Broken {
+        msg: e.to_string(),
+        kind: e.kind(),
+      });
     }
+    r?
   }
 }