use super::{File, FileHandle, FileInfo, FromUefi, RegularFile};
use crate::data_types::Align;
use crate::prelude::*;
use crate::Result;
use core::ffi::c_void;
#[repr(transparent)]
pub struct Directory(RegularFile);
impl Directory {
pub unsafe fn new(handle: FileHandle) -> Self {
Self(RegularFile::new(handle))
}
pub fn read_entry<'buf>(
&mut self,
buffer: &'buf mut [u8],
) -> Result<Option<&'buf mut FileInfo>, Option<usize>> {
FileInfo::assert_aligned(buffer);
self.0.read(buffer).map_inner(|size| {
if size != 0 {
unsafe { Some(FileInfo::from_uefi(buffer.as_mut_ptr() as *mut c_void)) }
} else {
None
}
})
}
pub fn reset_entry_readout(&mut self) -> Result {
self.0.set_position(0)
}
}
impl File for Directory {
#[inline]
fn handle(&mut self) -> &mut FileHandle {
self.0.handle()
}
}