use std::{
io,
path::{Path, PathBuf},
};
use serde::{Deserialize, Serialize};
#[derive(
// CRUD-C: Constructors
Deserialize,
strum::EnumString,
Default,
Clone,
// CRUD-R: Comparisons
PartialEq,
Eq,
Hash,
// CRUD-R: Displayers
Debug,
strum::IntoStaticStr,
strum::Display,
// CRUD-R: Misc
Serialize,
)]
pub enum WriteMode {
#[default]
#[strum(
serialize = "CreateNew",
serialize = "Create",
serialize = "C",
ascii_case_insensitive
)]
CreateNew,
#[strum(
serialize = "OverwriteExisting",
serialize = "Overwrite",
serialize = "O",
ascii_case_insensitive
)]
OverwriteExisting,
#[strum(
serialize = "ClassicWrite",
serialize = "Write",
serialize = "W",
ascii_case_insensitive
)]
ClassicWrite,
#[cfg(feature = "append")]
#[strum(
serialize = "ClassicAppend",
serialize = "Append",
serialize = "A",
ascii_case_insensitive
)]
ClassicAppend,
#[cfg(feature = "append")]
#[strum(
serialize = "AppendToExisting",
serialize = "Extend",
serialize = "E",
ascii_case_insensitive
)]
AppendToExisting,
}
impl WriteMode {
pub fn fe_open<P>(&self, path: P) -> io::Result<fs_err::File>
where
P: Into<PathBuf>,
{
self.fe_open_options().open(path)
}
pub fn std_open<P>(&self, path: P) -> io::Result<std::fs::File>
where
P: AsRef<Path>,
{
self.std_open_options().open(path)
}
pub fn fe_open_options(&self) -> fs_err::OpenOptions {
fs_err::OpenOptions::from_options(self.std_open_options())
}
pub fn std_open_options(&self) -> std::fs::OpenOptions {
let mut options = std::fs::File::options();
options.write(true).read(false);
match self {
Self::CreateNew => {
options.create_new(true).create(true);
}
Self::OverwriteExisting => {
options.create_new(false).create(false);
}
Self::ClassicWrite => {
options.create_new(false).create(true);
}
#[cfg(feature = "append")]
Self::ClassicAppend => {
options.create_new(false).create(true).append(true);
}
#[cfg(feature = "append")]
Self::AppendToExisting => {
options.create_new(false).create(false).append(true);
}
}
options
}
}