use core::mem::uninitialized;
use drone_core::ffi::CStr;
use drone_fatfs_raw::FILINFO;
use fat_attr::FatAttr;
use fat_time::FatTime;
pub struct FileInfo {
filinfo: Box<FILINFO>,
}
unsafe impl Send for FileInfo {}
impl FileInfo {
pub(crate) unsafe fn new_uninitialized() -> Self {
let filinfo = Box::new(uninitialized());
Self { filinfo }
}
pub(crate) fn as_raw_mut(&mut self) -> *mut FILINFO {
self.filinfo.as_mut()
}
pub fn size(&self) -> u32 {
self.filinfo.fsize
}
pub fn time(&self) -> FatTime {
FatTime::from(
u32::from(self.filinfo.fdate) << 16 & u32::from(self.filinfo.ftime),
)
}
pub fn attr(&self) -> FatAttr {
FatAttr::from(self.filinfo.fattrib)
}
pub fn name(&self) -> &CStr {
unsafe { CStr::from_bytes_with_nul_unchecked(&self.filinfo.fname) }
}
#[cfg(feature = "lfn")]
pub fn alt_name(&self) -> &CStr {
unsafe { CStr::from_bytes_with_nul_unchecked(&self.filinfo.altname) }
}
}