use std::fs;
use nt_time::FileTime;
use windows::Win32::Storage::{
CloudFilters::CF_FS_METADATA,
FileSystem::{FILE_ATTRIBUTE_DIRECTORY, FILE_ATTRIBUTE_NORMAL, FILE_BASIC_INFO},
};
use crate::sealed;
#[derive(Debug, Clone, Copy, Default)]
pub struct Metadata(pub(crate) CF_FS_METADATA);
impl Metadata {
pub fn file() -> Self {
Self(CF_FS_METADATA {
BasicInfo: FILE_BASIC_INFO {
FileAttributes: FILE_ATTRIBUTE_NORMAL.0,
..Default::default()
},
..Default::default()
})
}
pub fn directory() -> Self {
Self(CF_FS_METADATA {
BasicInfo: FILE_BASIC_INFO {
FileAttributes: FILE_ATTRIBUTE_DIRECTORY.0,
..Default::default()
},
..Default::default()
})
}
pub fn created(mut self, time: FileTime) -> Self {
self.0.BasicInfo.CreationTime = time.try_into().unwrap();
self
}
pub fn accessed(mut self, time: FileTime) -> Self {
self.0.BasicInfo.LastAccessTime = time.try_into().unwrap();
self
}
pub fn written(mut self, time: FileTime) -> Self {
self.0.BasicInfo.LastWriteTime = time.try_into().unwrap();
self
}
pub fn changed(mut self, time: FileTime) -> Self {
self.0.BasicInfo.ChangeTime = time.try_into().unwrap();
self
}
pub fn size(mut self, size: u64) -> Self {
self.0.FileSize = size as i64;
self
}
pub fn attributes(mut self, attributes: u32) -> Self {
self.0.BasicInfo.FileAttributes |= attributes;
self
}
}
pub trait MetadataExt: sealed::Sealed {
fn change_time(self, time: i64) -> Self;
fn last_access_time(self, time: i64) -> Self;
fn last_write_time(self, time: i64) -> Self;
fn creation_time(self, time: i64) -> Self;
}
impl MetadataExt for Metadata {
fn change_time(mut self, time: i64) -> Self {
self.0.BasicInfo.ChangeTime = time;
self
}
fn last_access_time(mut self, time: i64) -> Self {
self.0.BasicInfo.LastAccessTime = time;
self
}
fn last_write_time(mut self, time: i64) -> Self {
self.0.BasicInfo.LastWriteTime = time;
self
}
fn creation_time(mut self, time: i64) -> Self {
self.0.BasicInfo.CreationTime = time;
self
}
}
impl sealed::Sealed for Metadata {}
impl From<fs::Metadata> for Metadata {
fn from(metadata: fs::Metadata) -> Self {
use std::os::windows::fs::MetadataExt;
Self(CF_FS_METADATA {
BasicInfo: FILE_BASIC_INFO {
CreationTime: metadata.creation_time() as i64,
LastAccessTime: metadata.last_access_time() as i64,
LastWriteTime: metadata.last_write_time() as i64,
ChangeTime: metadata.last_write_time() as i64,
FileAttributes: metadata.file_attributes(),
},
FileSize: metadata.file_size() as i64,
})
}
}