sim_lib_stream_file/
cap.rs1use sim_kernel::{CapabilityName, Cx, Symbol};
2
3pub fn stream_file_read_capability() -> CapabilityName {
13 CapabilityName::new("fs/read")
14}
15
16pub fn stream_file_write_capability() -> CapabilityName {
18 CapabilityName::new("fs/write")
19}
20
21pub(crate) fn stream_file_filesystem_effect_kind() -> Symbol {
22 Symbol::qualified("effect", "filesystem")
23}
24
25pub(crate) fn stream_file_read_effect_capability(cx: &Cx) -> CapabilityName {
26 granted_capability_or_alias(cx, stream_file_read_capability(), fs_read_aliases())
27 .unwrap_or_else(stream_file_read_capability)
28}
29
30pub(crate) fn stream_file_write_effect_capability(cx: &Cx) -> CapabilityName {
31 granted_capability_or_alias(cx, stream_file_write_capability(), fs_write_aliases())
32 .unwrap_or_else(stream_file_write_capability)
33}
34
35fn fs_read_aliases() -> &'static [&'static str] {
36 &["table.fs.read", "stream.file.read", "file-read"]
37}
38
39fn fs_write_aliases() -> &'static [&'static str] {
40 &["table.fs.write", "stream.file.write", "file-write"]
41}
42
43fn granted_capability_or_alias(
44 cx: &Cx,
45 canonical: CapabilityName,
46 aliases: &'static [&'static str],
47) -> Option<CapabilityName> {
48 if cx.capabilities().contains(&canonical) {
49 return Some(canonical);
50 }
51 aliases
52 .iter()
53 .copied()
54 .map(CapabilityName::new)
55 .find(|alias| cx.capabilities().contains(alias))
56}