sim_lib_plugin_core/
capability.rs1use std::collections::BTreeSet;
2
3use sim_kernel::{CapabilityName, Error, Result};
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
7pub enum AudioPluginCapability {
8 WasmPlugin,
10 NativePlugin,
12}
13
14impl AudioPluginCapability {
15 pub fn as_capability_name(self) -> CapabilityName {
17 match self {
18 Self::WasmPlugin => CapabilityName::new("plugin.audio.wasm"),
19 Self::NativePlugin => CapabilityName::new("plugin.audio.native"),
20 }
21 }
22}
23
24#[derive(Clone, Debug, Default, PartialEq, Eq)]
26pub struct CapabilitySet {
27 granted: BTreeSet<AudioPluginCapability>,
28}
29
30impl CapabilitySet {
31 pub fn empty() -> Self {
33 Self::default()
34 }
35
36 pub fn with(capability: AudioPluginCapability) -> Self {
38 Self::empty().grant(capability)
39 }
40
41 pub fn grant(mut self, capability: AudioPluginCapability) -> Self {
43 self.granted.insert(capability);
44 self
45 }
46
47 pub fn insert(&mut self, capability: AudioPluginCapability) {
49 self.granted.insert(capability);
50 }
51
52 pub fn contains(&self, capability: AudioPluginCapability) -> bool {
54 self.granted.contains(&capability)
55 }
56
57 pub fn require(&self, capability: AudioPluginCapability) -> Result<()> {
59 if self.contains(capability) {
60 Ok(())
61 } else {
62 Err(Error::CapabilityDenied {
63 capability: capability.as_capability_name(),
64 })
65 }
66 }
67}