hff_core/
chunk_cache.rs

1use crate::{ContentInfo, Error, Result};
2
3/// Act as a ReadSeek IO object for purposes of having
4/// an entire HFF in memory at one time.
5#[derive(Debug, Clone)]
6pub struct ChunkCache {
7    offset: u64,
8    buffer: Vec<u8>,
9}
10
11impl ChunkCache {
12    /// Create a new chunk cache.
13    pub fn new(offset: usize, buffer: Vec<u8>) -> Self {
14        Self {
15            offset: offset as u64,
16            buffer,
17        }
18    }
19
20    /// Get a slice representing the given content.
21    pub fn read(&self, content: &dyn ContentInfo) -> Result<&'_ [u8]> {
22        if content.len() > 0 {
23            assert!(
24                content.offset() >= self.offset,
25                "{} {}",
26                content.offset(),
27                self.offset
28            );
29            let offset = content.offset() - self.offset;
30            Ok(&self.buffer[offset as usize..(offset + content.len()) as usize])
31        } else {
32            Err(Error::Invalid("No data for this content.".into()))
33        }
34    }
35}