macro_rules! actions {
($name:ident, $request:ident, [$( $variant:ident => $value:literal ),+ $(,)?]) => {
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum $name { $( $variant ),+ }
impl $name {
pub fn parse(value: &str) -> Option<Self> {
match value { $( $value => Some(Self::$variant), )+ _ => None }
}
pub const fn as_str(self) -> &'static str {
match self { $( Self::$variant => $value, )+ }
}
}
impl From<$name> for $request {
fn from(value: $name) -> Self { Self::Known(value) }
}
};
}
use super::{RequestedDocAction, RequestedWorkspaceAction};
actions!(WorkspaceAction, RequestedWorkspaceAction, [
Read => "Workspace.Read",
OrganizeRead => "Workspace.Organize.Read",
PropertiesRead => "Workspace.Properties.Read",
Sync => "Workspace.Sync",
CreateDoc => "Workspace.CreateDoc",
UsersRead => "Workspace.Users.Read",
SettingsRead => "Workspace.Settings.Read",
BlobsUpload => "Workspace.Blobs.Upload",
Copilot => "Workspace.Copilot",
UsersManage => "Workspace.Users.Manage",
AdministratorsManage => "Workspace.Administrators.Manage",
SettingsUpdate => "Workspace.Settings.Update",
PropertiesCreate => "Workspace.Properties.Create",
PropertiesUpdate => "Workspace.Properties.Update",
PropertiesDelete => "Workspace.Properties.Delete",
BlobsManage => "Workspace.Blobs.Manage",
Delete => "Workspace.Delete",
TransferOwner => "Workspace.TransferOwner",
PaymentManage => "Workspace.Payment.Manage",
Preview => "Workspace.Preview",
]);
actions!(DocAction, RequestedDocAction, [
Read => "Doc.Read",
Copy => "Doc.Copy",
PropertiesRead => "Doc.Properties.Read",
CommentsRead => "Doc.Comments.Read",
UsersRead => "Doc.Users.Read",
Duplicate => "Doc.Duplicate",
HistoryRead => "Doc.History.Read",
CommentsCreate => "Doc.Comments.Create",
PropertiesUpdate => "Doc.Properties.Update",
Update => "Doc.Update",
AnalyticsRead => "Doc.Analytics.Read",
AnalyticsViewersRead => "Doc.Analytics.Viewers.Read",
Publish => "Doc.Publish",
Unpublish => "Doc.Unpublish",
Trash => "Doc.Trash",
Restore => "Doc.Restore",
Delete => "Doc.Delete",
UsersManage => "Doc.Users.Manage",
CommentsModerate => "Doc.Comments.Moderate",
TransferOwner => "Doc.TransferOwner",
Preview => "Doc.Preview",
]);
const WORKSPACE_ACTIONS: &[WorkspaceAction] = &[
WorkspaceAction::Read,
WorkspaceAction::OrganizeRead,
WorkspaceAction::PropertiesRead,
WorkspaceAction::Sync,
WorkspaceAction::CreateDoc,
WorkspaceAction::UsersRead,
WorkspaceAction::SettingsRead,
WorkspaceAction::BlobsUpload,
WorkspaceAction::Copilot,
WorkspaceAction::UsersManage,
WorkspaceAction::AdministratorsManage,
WorkspaceAction::SettingsUpdate,
WorkspaceAction::PropertiesCreate,
WorkspaceAction::PropertiesUpdate,
WorkspaceAction::PropertiesDelete,
WorkspaceAction::BlobsManage,
WorkspaceAction::Delete,
WorkspaceAction::TransferOwner,
WorkspaceAction::PaymentManage,
WorkspaceAction::Preview,
];
const DOC_ACTIONS: &[DocAction] = &[
DocAction::Read,
DocAction::Copy,
DocAction::PropertiesRead,
DocAction::CommentsRead,
DocAction::UsersRead,
DocAction::Duplicate,
DocAction::HistoryRead,
DocAction::CommentsCreate,
DocAction::PropertiesUpdate,
DocAction::Update,
DocAction::AnalyticsRead,
DocAction::AnalyticsViewersRead,
DocAction::Publish,
DocAction::Unpublish,
DocAction::Trash,
DocAction::Restore,
DocAction::Delete,
DocAction::UsersManage,
DocAction::CommentsModerate,
DocAction::TransferOwner,
DocAction::Preview,
];
pub fn workspace_action_catalog() -> &'static [WorkspaceAction] {
WORKSPACE_ACTIONS
}
pub fn doc_action_catalog() -> &'static [DocAction] {
DOC_ACTIONS
}