use std::io;
use zerocopy::{Immutable, KnownLayout, TryFromBytes};
use super::FileFlags;
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Immutable, KnownLayout, TryFromBytes)]
#[repr(u8)]
pub enum FileCopyMode {
#[default]
Normal = 0,
IfDoesntExist = 1,
AlwaysOverwrite = 2,
AlwaysSkipIfSameOrOlder = 3,
}
impl FileCopyMode {
pub fn try_read_from_io<R>(mut src: R) -> io::Result<Self>
where
Self: TryFromBytes + Sized,
R: io::Read,
{
let mut buf = [0; size_of::<Self>()];
src.read_exact(&mut buf)?;
Self::try_read_from_bytes(&buf)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err.to_string()))
}
}
impl From<FileCopyMode> for FileFlags {
fn from(mode: FileCopyMode) -> Self {
match mode {
FileCopyMode::Normal => Self::PROMPT_IF_OLDER,
FileCopyMode::IfDoesntExist => Self::ONLY_IF_DOESNT_EXIST | Self::PROMPT_IF_OLDER,
FileCopyMode::AlwaysOverwrite => Self::IGNORE_VERSION | Self::PROMPT_IF_OLDER,
FileCopyMode::AlwaysSkipIfSameOrOlder => Self::empty(),
}
}
}