Skip to main content

sim_lib_stream_file/
cap.rs

1use sim_kernel::{CapabilityName, Cx, Symbol};
2
3/// Returns the capability gating filesystem reads (`fs/read`).
4///
5/// # Examples
6///
7/// ```
8/// use sim_lib_stream_file::stream_file_read_capability;
9///
10/// assert_eq!(stream_file_read_capability().as_str(), "fs/read");
11/// ```
12pub fn stream_file_read_capability() -> CapabilityName {
13    CapabilityName::new("fs/read")
14}
15
16/// Returns the capability gating filesystem writes (`fs/write`).
17pub 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}