sim_lib_stream_host/
capability.rs1use sim_kernel::{CapabilityName, Expr, Symbol};
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq)]
7pub enum DeviceCapability {
8 Pose,
10 Camera,
12 Health,
14 Location,
16 Mic,
18 VendorReport,
20}
21
22impl DeviceCapability {
23 pub const ALL: [Self; 6] = [
25 Self::Pose,
26 Self::Camera,
27 Self::Health,
28 Self::Location,
29 Self::Mic,
30 Self::VendorReport,
31 ];
32
33 pub fn as_str(self) -> &'static str {
35 match self {
36 Self::Pose => "device/pose",
37 Self::Camera => "device/camera",
38 Self::Health => "device/health",
39 Self::Location => "device/location",
40 Self::Mic => "device/mic",
41 Self::VendorReport => "device/vendor-report",
42 }
43 }
44
45 pub fn capability_name(self) -> CapabilityName {
47 CapabilityName::new(self.as_str())
48 }
49
50 pub fn grant_symbol(self) -> Symbol {
52 Symbol::qualified("device", self.local_name())
53 }
54
55 pub fn from_name(name: &str) -> Option<Self> {
57 Self::ALL
58 .into_iter()
59 .find(|capability| capability.as_str() == name)
60 }
61
62 fn local_name(self) -> &'static str {
63 self.as_str()
64 .strip_prefix("device/")
65 .expect("device capability names keep the device/ prefix")
66 }
67}
68
69#[derive(Clone, Copy, Debug, PartialEq, Eq)]
84pub enum HostBackendCapability {
85 AudioInput,
87 AudioOutput,
89 MidiInput,
91 MidiOutput,
93 Duplex,
95 Hotplug,
97 Reconnect,
99 Offline,
101 Fake,
103}
104
105impl HostBackendCapability {
106 pub fn symbol(self) -> Symbol {
108 match self {
109 Self::AudioInput => Symbol::qualified("stream/host-capability", "audio-input"),
110 Self::AudioOutput => Symbol::qualified("stream/host-capability", "audio-output"),
111 Self::MidiInput => Symbol::qualified("stream/host-capability", "midi-input"),
112 Self::MidiOutput => Symbol::qualified("stream/host-capability", "midi-output"),
113 Self::Duplex => Symbol::qualified("stream/host-capability", "duplex"),
114 Self::Hotplug => Symbol::qualified("stream/host-capability", "hotplug"),
115 Self::Reconnect => Symbol::qualified("stream/host-capability", "reconnect"),
116 Self::Offline => Symbol::qualified("stream/host-capability", "offline"),
117 Self::Fake => Symbol::qualified("stream/host-capability", "fake"),
118 }
119 }
120}
121
122pub fn missing_capability_card_expr(backend: &Symbol, capability: HostBackendCapability) -> Expr {
124 Expr::Map(vec![
125 (
126 Expr::Symbol(Symbol::new("subject")),
127 Expr::Symbol(backend.clone()),
128 ),
129 (
130 Expr::Symbol(Symbol::new("kind")),
131 Expr::Symbol(Symbol::qualified("stream", "host-missing-capability")),
132 ),
133 (
134 Expr::Symbol(Symbol::new("capability")),
135 Expr::Symbol(capability.symbol()),
136 ),
137 ])
138}