use crate::{acl::Identifier, platform::Target};
use serde::{Deserialize, Serialize};
use super::Scopes;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum PermissionEntry {
PermissionRef(Identifier),
ExtendedPermission {
identifier: Identifier,
#[serde(default, flatten)]
scope: Scopes,
},
}
impl PermissionEntry {
pub fn identifier(&self) -> &Identifier {
match self {
Self::PermissionRef(identifier) => identifier,
Self::ExtendedPermission {
identifier,
scope: _,
} => identifier,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct Capability {
pub identifier: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub context: CapabilityContext,
pub windows: Vec<String>,
pub permissions: Vec<PermissionEntry>,
#[serde(default = "default_platforms")]
pub platforms: Vec<Target>,
}
fn default_platforms() -> Vec<Target> {
vec![
Target::Linux,
Target::MacOS,
Target::Windows,
Target::Android,
Target::Ios,
]
}
#[derive(Debug, Default, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "camelCase")]
pub enum CapabilityContext {
#[default]
Local,
Remote {
domains: Vec<String>,
},
}