mirror of
https://github.com/librespot-org/librespot.git
synced 2025-10-06 03:50:06 +02:00
38 lines
911 B
Rust
38 lines
911 B
Rust
use std::io::{Read, Seek, SeekFrom, Result};
|
|
|
|
pub struct Subfile<T: Read + Seek> {
|
|
stream: T,
|
|
offset: u64,
|
|
}
|
|
|
|
impl<T: Read + Seek> Subfile<T> {
|
|
pub fn new(mut stream: T, offset: u64) -> Subfile<T> {
|
|
stream.seek(SeekFrom::Start(offset)).unwrap();
|
|
Subfile {
|
|
stream: stream,
|
|
offset: offset,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Read + Seek> Read for Subfile<T> {
|
|
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
|
|
self.stream.read(buf)
|
|
}
|
|
}
|
|
|
|
impl<T: Read + Seek> Seek for Subfile<T> {
|
|
fn seek(&mut self, mut pos: SeekFrom) -> Result<u64> {
|
|
pos = match pos {
|
|
SeekFrom::Start(offset) => SeekFrom::Start(offset + self.offset),
|
|
x => x,
|
|
};
|
|
|
|
let newpos = try!(self.stream.seek(pos));
|
|
if newpos > self.offset {
|
|
Ok(newpos - self.offset)
|
|
} else {
|
|
Ok(0)
|
|
}
|
|
}
|
|
}
|