use core::cmp::Ordering;
use core::fmt;
use core::hash::{Hash, Hasher};
pub enum FileAccessMode {
Read,
Append,
Overwrite,
ReadMmap,
ReadWriteMmap,
Truncate,
}
impl FileAccessMode {
fn rank(&self) -> u8 {
match self {
Self::Read => 0,
Self::Append => 1,
Self::Overwrite => 2,
Self::ReadMmap => 3,
Self::ReadWriteMmap => 4,
Self::Truncate => 5,
}
}
fn debug_name(&self) -> &'static str {
match self {
Self::Read => "Read",
Self::Append => "Append",
Self::Overwrite => "Overwrite",
Self::ReadMmap => "ReadMmap",
Self::ReadWriteMmap => "ReadWriteMmap",
Self::Truncate => "Truncate",
}
}
fn display_name(&self) -> &'static str {
match self {
Self::Read => "read",
Self::Append => "append",
Self::Overwrite => "overwrite",
Self::ReadMmap => "read-mmap",
Self::ReadWriteMmap => "read-write-mmap",
Self::Truncate => "truncate",
}
}
}
impl fmt::Debug for FileAccessMode {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.debug_name())
}
}
impl fmt::Display for FileAccessMode {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.display_name())
}
}
impl PartialEq for FileAccessMode {
fn eq(&self, other: &Self) -> bool {
self.rank() == other.rank()
}
}
impl Eq for FileAccessMode {}
impl PartialOrd for FileAccessMode {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl Ord for FileAccessMode {
fn cmp(&self, other: &Self) -> Ordering {
self.rank().cmp(&other.rank())
}
}
impl Hash for FileAccessMode {
fn hash<H>(&self, state: &mut H)
where
H: Hasher,
{
self.rank().hash(state);
}
}