use std::fs::{File, OpenOptions};
use std::io;
use std::os::windows::fs::OpenOptionsExt;
use std::path::Path;
use durable_ioring::DataAccess;
use wtf_string::Wtf16String;
use super::file_rights::FileRights;
use super::opened_file::{Buffering, data_access, data_rights, refine_sharing};
use super::share_mode::ShareMode;
#[cfg(test)]
mod tests;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(super) struct RawOpen {
pub access: u32,
pub flags: u32,
pub share: u32,
}
pub(super) fn raw_open_of<B: Buffering, A: DataAccess>(share: ShareMode) -> RawOpen {
RawOpen {
access: data_rights::<A>(),
flags: B::FLAGS,
share: share.bits(),
}
}
pub(super) fn open<B: Buffering, A: DataAccess>(
path: impl AsRef<Path>,
share: ShareMode,
) -> io::Result<File> {
let path = path.as_ref();
let asked = raw_open_of::<B, A>(share);
OpenOptions::new()
.access_mode(asked.access)
.share_mode(asked.share)
.custom_flags(asked.flags)
.open(path)
.map_err(|error| {
let given = Wtf16String::from_os_str(path.as_os_str());
refine_sharing(error, &given, data_access::<A>(), FileRights::NONE, share)
})
}