use core::fmt::{Display, Formatter, Result as FmtResult};
use thiserror::Error as ThisError;
#[derive(Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum ApiVerb {
RetrieveFolderStatus,
RetrieveFileStatus,
Version,
GetStrings,
GetMenuItems,
ShareMenuTitle,
Activity,
Encrypt,
Share,
Leaveshare,
ManagePublicLinks,
CopySecurefiledropLink,
CopyPublicLink,
CopyPrivateLink,
EmailPrivateLink,
OpenPrivateLink,
MakeAvailableLocally,
MakeOnlineOnly,
ResolveConflict,
DeleteItem,
MoveItem,
LockFile,
UnlockFile,
UpdateFolderView,
RegisterPath,
UnregisterPath,
String,
Status,
MenuItem,
}
#[derive(Debug, ThisError)]
#[non_exhaustive]
pub enum Error {
#[error("failed to parse verb: {0}")]
ParsingFailed(String),
}
impl From<ApiVerb> for &str {
#[inline]
fn from(value: ApiVerb) -> Self {
Self::from(&value)
}
}
impl From<&ApiVerb> for &str {
#[inline]
fn from(value: &ApiVerb) -> Self {
match *value {
ApiVerb::RetrieveFolderStatus => "RETRIEVE_FOLDER_STATUS",
ApiVerb::RetrieveFileStatus => "RETRIEVE_FILE_STATUS",
ApiVerb::Version => "VERSION",
ApiVerb::GetStrings => "GET_STRINGS",
ApiVerb::GetMenuItems => "GET_MENU_ITEMS",
ApiVerb::ShareMenuTitle => "SHARE_MENU_TITLE",
ApiVerb::Activity => "ACTIVITY",
ApiVerb::Encrypt => "ENCRYPT",
ApiVerb::Share => "SHARE",
ApiVerb::Leaveshare => "LEAVESHARE",
ApiVerb::ManagePublicLinks => "MANAGE_PUBLIC_LINKS",
ApiVerb::CopySecurefiledropLink => "COPY_SECUREFILEDROP_LINK",
ApiVerb::CopyPublicLink => "COPY_PUBLIC_LINK",
ApiVerb::CopyPrivateLink => "COPY_PRIVATE_LINK",
ApiVerb::EmailPrivateLink => "EMAIL_PRIVATE_LINK",
ApiVerb::OpenPrivateLink => "OPEN_PRIVATE_LINK",
ApiVerb::MakeAvailableLocally => "MAKE_AVAILABLE_LOCALLY",
ApiVerb::MakeOnlineOnly => "MAKE_ONLINE_ONLY",
ApiVerb::ResolveConflict => "RESOLVE_CONFLICT",
ApiVerb::DeleteItem => "DELETE_ITEM",
ApiVerb::MoveItem => "MOVE_ITEM",
ApiVerb::LockFile => "LOCK_FILE",
ApiVerb::UnlockFile => "UNLOCK_FILE",
ApiVerb::UpdateFolderView => "UPDATE_VIEW",
ApiVerb::RegisterPath => "REGISTER_PATH",
ApiVerb::UnregisterPath => "UNREGISTER_PATH",
ApiVerb::String => "STRING",
ApiVerb::Status => "STATUS",
ApiVerb::MenuItem => "MENU_ITEM",
}
}
}
impl TryFrom<&str> for ApiVerb {
type Error = Error;
fn try_from(value: &str) -> Result<Self, Self::Error> {
Ok(match value {
"RETRIEVE_FOLDER_STATUS" => ApiVerb::RetrieveFolderStatus,
"RETRIEVE_FILE_STATUS" => ApiVerb::RetrieveFileStatus,
"VERSION" => ApiVerb::Version,
"GET_STRINGS" => ApiVerb::GetStrings,
"GET_MENU_ITEMS" => ApiVerb::GetMenuItems,
"SHARE_MENU_TITLE" => ApiVerb::ShareMenuTitle,
"ACTIVITY" => ApiVerb::Activity,
"ENCRYPT" => ApiVerb::Encrypt,
"SHARE" => ApiVerb::Share,
"LEAVESHARE" => ApiVerb::Leaveshare,
"MANAGE_PUBLIC_LINKS" => ApiVerb::ManagePublicLinks,
"COPY_SECUREFILEDROP_LINK" => ApiVerb::CopySecurefiledropLink,
"COPY_PUBLIC_LINK" => ApiVerb::CopyPublicLink,
"COPY_PRIVATE_LINK" => ApiVerb::CopyPrivateLink,
"EMAIL_PRIVATE_LINK" => ApiVerb::EmailPrivateLink,
"OPEN_PRIVATE_LINK" => ApiVerb::OpenPrivateLink,
"MAKE_AVAILABLE_LOCALLY" => ApiVerb::MakeAvailableLocally,
"MAKE_ONLINE_ONLY" => ApiVerb::MakeOnlineOnly,
"RESOLVE_CONFLICT" => ApiVerb::ResolveConflict,
"DELETE_ITEM" => ApiVerb::DeleteItem,
"MOVE_ITEM" => ApiVerb::MoveItem,
"LOCK_FILE" => ApiVerb::LockFile,
"UNLOCK_FILE" => ApiVerb::UnlockFile,
"UPDATE_VIEW" => ApiVerb::UpdateFolderView,
"REGISTER_PATH" => ApiVerb::RegisterPath,
"UNREGISTER_PATH" => ApiVerb::UnregisterPath,
"STRING" => ApiVerb::String,
"STATUS" => ApiVerb::Status,
"MENU_ITEM" => ApiVerb::MenuItem,
_ => return Err(Error::ParsingFailed(format!("invalid verb: {value}"))),
})
}
}
impl Display for ApiVerb {
#[expect(clippy::min_ident_chars, reason = "defined by trait")]
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
let verb: &str = self.into();
write!(f, "{verb}")
}
}