use std::fs as std_fs;
use strum_macros::{Display, EnumString};
use tokio::fs as tokio_fs;
use crate::common::*;
#[derive(Clone, Copy, Debug, Display, EnumString, Eq, PartialEq)]
#[strum(serialize_all = "snake_case")]
pub enum IfExists {
Error,
Append,
Overwrite,
}
impl IfExists {
pub(crate) fn to_async_open_options_no_append(
self,
) -> Result<tokio_fs::OpenOptions> {
let mut open_options = tokio_fs::OpenOptions::new();
open_options.write(true);
match self {
IfExists::Error => {
open_options.create_new(true);
}
IfExists::Overwrite => {
open_options.create(true).append(true);
}
IfExists::Append => {
return Err(format_err!("appending not supported"));
}
}
Ok(open_options)
}
pub(crate) fn to_sync_open_options_no_append(self) -> Result<std_fs::OpenOptions> {
let mut open_options = std_fs::OpenOptions::new();
open_options.write(true);
match self {
IfExists::Error => {
open_options.create_new(true);
}
IfExists::Overwrite => {
open_options.create(true).append(true);
}
IfExists::Append => {
return Err(format_err!("appending not supported"));
}
}
Ok(open_options)
}
pub(crate) fn warn_if_not_default_for_stdout(self, ctx: &Context) {
if self != IfExists::default() {
warn!(ctx.log(), "{} ignored for stdout", self)
}
}
}
impl Default for IfExists {
fn default() -> Self {
IfExists::Error
}
}