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(),
}
}
+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)