#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum AccessMode {
Read,
Write,
Deny,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum FilesystemDecision {
Read,
Write,
Deny,
ExternallyEnforced,
}
impl AccessMode {
pub const fn can_read(self) -> bool {
matches!(self, Self::Read | Self::Write)
}
pub const fn can_write(self) -> bool {
matches!(self, Self::Write)
}
pub const fn most_restrictive(self, other: Self) -> Self {
match (self, other) {
(Self::Deny, _) | (_, Self::Deny) => Self::Deny,
(Self::Read, _) | (_, Self::Read) => Self::Read,
(Self::Write, Self::Write) => Self::Write,
}
}
pub const fn permits(self, requested: Self) -> bool {
matches!(
(self, requested),
(Self::Write, Self::Read | Self::Write)
| (Self::Read, Self::Read)
| (Self::Deny, Self::Deny)
)
}
}
impl FilesystemDecision {
pub const fn as_access_mode(self) -> Option<AccessMode> {
match self {
Self::Read => Some(AccessMode::Read),
Self::Write => Some(AccessMode::Write),
Self::Deny => Some(AccessMode::Deny),
Self::ExternallyEnforced => None,
}
}
pub const fn is_externally_enforced(self) -> bool {
matches!(self, Self::ExternallyEnforced)
}
}
impl From<AccessMode> for FilesystemDecision {
fn from(access: AccessMode) -> Self {
match access {
AccessMode::Read => Self::Read,
AccessMode::Write => Self::Write,
AccessMode::Deny => Self::Deny,
}
}
}