use serde::{Deserialize, Serialize};
use crate::*;
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
pub enum FileAccessMode {
Read,
#[deprecated(note = "This may or may not truncate existing contents. If the new file is smaller than the old one, this may cause the file to become corrupted.")]
Write,
WriteTruncate,
WriteAppend,
ReadWrite,
ReadWriteTruncate,
}
#[allow(unused)]
#[allow(deprecated)]
impl FileAccessMode {
pub(crate) fn to_mode(&self) -> &'static str {
match self {
FileAccessMode::Read => "r",
FileAccessMode::Write => "w",
FileAccessMode::WriteTruncate => "wt",
FileAccessMode::WriteAppend => "wa",
FileAccessMode::ReadWriteTruncate => "rwt",
FileAccessMode::ReadWrite => "rw",
}
}
pub(crate) fn from_mode(mode: &str) -> Result<Self> {
match mode {
"r" => Ok(Self::Read),
"w" => Ok(Self::Write),
"wt" => Ok(Self::WriteTruncate),
"wa" => Ok(Self::WriteAppend),
"rwt" => Ok(Self::ReadWriteTruncate),
"rw" => Ok(Self::ReadWrite),
mode => Err(Error::with(format!("Illegal mode: {mode}")))
}
}
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Deserialize, Serialize)]
pub enum UriPermission {
Read,
Write,
ReadAndWrite,
ReadOrWrite,
}
#[derive(Debug, Clone, Hash, PartialEq, Eq, Deserialize, Serialize)]
#[serde(tag = "type")]
pub enum PersistedUriPermissionState {
File {
uri: FsUri,
#[serde(rename = "canRead")]
can_read: bool,
#[serde(rename = "canWrite")]
can_write: bool,
},
Dir {
uri: FsUri,
#[serde(rename = "canRead")]
can_read: bool,
#[serde(rename = "canWrite")]
can_write: bool,
}
}
impl PersistedUriPermissionState {
pub fn uri(&self) -> &FsUri {
match self {
PersistedUriPermissionState::File { uri, .. } => uri,
PersistedUriPermissionState::Dir { uri, .. } => uri,
}
}
pub fn into_uri(self) -> FsUri {
match self {
PersistedUriPermissionState::File { uri, .. } => uri,
PersistedUriPermissionState::Dir { uri, .. } => uri,
}
}
pub fn can_read(&self) -> bool {
match self {
PersistedUriPermissionState::File { can_read, .. } => *can_read,
PersistedUriPermissionState::Dir { can_read, .. } => *can_read,
}
}
pub fn can_write(&self) -> bool {
match self {
PersistedUriPermissionState::File { can_write, .. } => *can_write,
PersistedUriPermissionState::Dir { can_write, .. } => *can_write,
}
}
pub fn is_file(&self) -> bool {
matches!(self, PersistedUriPermissionState::File { .. })
}
pub fn is_dir(&self) -> bool {
matches!(self, PersistedUriPermissionState::Dir { .. })
}
}