use std::collections::BTreeSet;
use sim_kernel::{CapabilityName, Error, Result};
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum AudioPluginCapability {
WasmPlugin,
NativePlugin,
}
impl AudioPluginCapability {
pub fn as_capability_name(self) -> CapabilityName {
match self {
Self::WasmPlugin => CapabilityName::new("plugin.audio.wasm"),
Self::NativePlugin => CapabilityName::new("plugin.audio.native"),
}
}
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct CapabilitySet {
granted: BTreeSet<AudioPluginCapability>,
}
impl CapabilitySet {
pub fn empty() -> Self {
Self::default()
}
pub fn with(capability: AudioPluginCapability) -> Self {
Self::empty().grant(capability)
}
pub fn grant(mut self, capability: AudioPluginCapability) -> Self {
self.granted.insert(capability);
self
}
pub fn insert(&mut self, capability: AudioPluginCapability) {
self.granted.insert(capability);
}
pub fn contains(&self, capability: AudioPluginCapability) -> bool {
self.granted.contains(&capability)
}
pub fn require(&self, capability: AudioPluginCapability) -> Result<()> {
if self.contains(capability) {
Ok(())
} else {
Err(Error::CapabilityDenied {
capability: capability.as_capability_name(),
})
}
}
}