use crate::memory::{error::Result, primitives::PhysicalAddress, readable::Readable};
use std::fs::File;
#[cfg(unix)]
use std::os::unix::fs::FileExt;
#[cfg(windows)]
use std::os::windows::fs::FileExt;
pub struct ReadableFile<'a> {
file: &'a mut File,
}
impl<'a> ReadableFile<'a> {
pub fn new(file: &'a mut File) -> Self {
Self { file }
}
}
impl<'a> Readable for ReadableFile<'a> {
#[cfg(unix)]
fn read(&self, buffer: &mut [u8], physical_address: PhysicalAddress) -> Result<usize> {
self.file
.read_at(buffer, physical_address.into())
.map_err(|error| error.into())
}
#[cfg(windows)]
fn read(&self, buffer: &mut [u8], physical_address: PhysicalAddress) -> Result<usize> {
self.file
.seek_read(buffer, physical_address.into())
.map_err(|error| error.into())
}
fn len(&self) -> Result<u64> {
Ok(self.file.metadata()?.len())
}
}