use super::{File, FileHandle, FileInternal};
use crate::{Result, Status};
#[repr(transparent)]
pub struct RegularFile(FileHandle);
impl RegularFile {
pub const END_OF_FILE: u64 = core::u64::MAX;
pub unsafe fn new(handle: FileHandle) -> Self {
Self(handle)
}
pub fn read(&mut self, buffer: &mut [u8]) -> Result<usize, Option<usize>> {
let mut buffer_size = buffer.len();
unsafe { (self.imp().read)(self.imp(), &mut buffer_size, buffer.as_mut_ptr()) }.into_with(
|| buffer_size,
|s| {
if s == Status::BUFFER_TOO_SMALL {
Some(buffer_size)
} else {
None
}
},
)
}
pub fn write(&mut self, buffer: &[u8]) -> Result<(), usize> {
let mut buffer_size = buffer.len();
unsafe { (self.imp().write)(self.imp(), &mut buffer_size, buffer.as_ptr()) }
.into_with_err(|_| buffer_size)
}
pub fn get_position(&mut self) -> Result<u64> {
let mut pos = 0u64;
(self.imp().get_position)(self.imp(), &mut pos).into_with_val(|| pos)
}
pub fn set_position(&mut self, position: u64) -> Result {
(self.imp().set_position)(self.imp(), position).into()
}
}
impl File for RegularFile {
#[inline]
fn handle(&mut self) -> &mut FileHandle {
&mut self.0
}
}