use heck::ToSnakeCase;
use itertools::Itertools;
use std::{collections::HashSet, fmt};
use crate::npk::manifest::console::{
Permission as ManifestPermission, Permissions as ManifestPermissions,
};
#[derive(Debug, Clone)]
pub struct Permissions(HashSet<Permission>);
impl Permissions {
pub fn contains(&self, permission: &Permission) -> bool {
self.0.contains(permission)
}
}
impl fmt::Display for Permissions {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0.iter().sorted().format(", "))
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash, PartialOrd, Ord)]
pub enum Permission {
Ident,
Inspect,
Install,
Kill,
List,
Notifications,
Mount,
Repositories,
Shutdown,
Start,
StartCommand,
TokenCreate,
TokenVerification,
Umount,
Uninstall,
}
impl fmt::Display for Permission {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
let s = format!("{:?}", self).to_snake_case();
write!(f, "{}", s)
}
}
impl From<crate::npk::manifest::console::Permissions> for Permissions {
fn from(permissions: ManifestPermissions) -> Self {
Permissions(permissions.iter().cloned().map(Into::into).collect())
}
}
impl From<crate::npk::manifest::console::Permission> for Permission {
fn from(permission: ManifestPermission) -> Permission {
match permission {
ManifestPermission::Ident => Permission::Ident,
ManifestPermission::Inspect => Permission::Inspect,
ManifestPermission::Install => Permission::Install,
ManifestPermission::Kill => Permission::Kill,
ManifestPermission::List => Permission::List,
ManifestPermission::Notifications => Permission::Notifications,
ManifestPermission::Mount => Permission::Mount,
ManifestPermission::Repositories => Permission::Repositories,
ManifestPermission::Shutdown => Permission::Shutdown,
ManifestPermission::Start => Permission::Start,
ManifestPermission::StartCommand => Permission::StartCommand,
ManifestPermission::TokenCreate => Permission::TokenCreate,
ManifestPermission::TokenVerification => Permission::TokenVerification,
ManifestPermission::Umount => Permission::Umount,
ManifestPermission::Uninstall => Permission::Uninstall,
}
}
}