pub mod redb;
use std::fmt::Debug;
use memmap2::{Mmap, MmapOptions};
use super::{ReadTargets, ReadTargetsMut};
use crate::StreamDescription;
#[derive(Debug)]
pub enum ResourceReaderBacking {
Buffer(Box<[u8]>),
MappedFile(MappedFileBacking),
}
impl ResourceReaderBacking {
pub fn as_slice(&self) -> &[u8] {
match self {
ResourceReaderBacking::Buffer(buffer) => buffer,
ResourceReaderBacking::MappedFile(mapped_file) => mapped_file.as_slice(),
}
}
}
#[derive(Debug)]
pub struct MappedFileBacking {
map: Mmap,
}
impl MappedFileBacking {
pub fn new(file: &std::fs::File) -> Result<Self, ()> {
let map = unsafe { MmapOptions::new().map(file) }.map_err(|_| ())?;
Ok(Self { map })
}
pub fn as_slice(&self) -> &[u8] {
&self.map[..]
}
}
pub trait ResourceReader: Send + Sync + Debug {
fn read_into<'b, 'c: 'b, 'a: 'b>(
&'b mut self,
stream_descriptions: Option<&'c [StreamDescription]>,
read_target: ReadTargetsMut<'a>,
) -> Result<ReadTargets<'a>, ()>;
fn into_backing_storage(self: Box<Self>) -> Result<ResourceReaderBacking, Box<dyn ResourceReader>>;
}