use std::io::{Read, Seek, SeekFrom, Result}; pub struct Subfile { stream: T, offset: u64 } impl Subfile { pub fn new(mut stream: T, offset: u64) -> Subfile { stream.seek(SeekFrom::Start(offset)).unwrap(); Subfile { stream: stream, offset: offset } } } impl Read for Subfile { fn read(&mut self, buf: &mut [u8]) -> Result { self.stream.read(buf) } } impl Seek for Subfile { fn seek(&mut self, mut pos: SeekFrom) -> Result { pos = match pos { SeekFrom::Start(offset) => SeekFrom::Start(offset + self.offset), x => x }; let newpos = try!(self.stream.seek(pos)); if newpos > self.offset { return Ok(newpos - self.offset) } else { return Ok(0) } } }