use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum FsAccess {
#[default]
None,
ReadOnly(Vec<PathBuf>),
ReadWrite(Vec<PathBuf>),
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum NetAccess {
#[default]
None,
OutboundHttp(Option<Vec<String>>),
OutboundFull(Option<Vec<String>>),
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub enum EnvAccess {
#[default]
None,
AllowList(Vec<String>),
Full,
}
#[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)]
pub struct Manifold {
pub fs: FsAccess,
pub net: NetAccess,
pub crypto: bool,
pub child_process: bool,
pub env: EnvAccess,
pub allow_exit: bool,
pub http_timeout_ms: Option<u64>,
}
impl Manifold {
pub const fn sealed() -> Self {
Self {
fs: FsAccess::None,
net: NetAccess::None,
crypto: false,
child_process: false,
env: EnvAccess::None,
allow_exit: false,
http_timeout_ms: None,
}
}
pub fn open() -> Self {
Self {
fs: FsAccess::ReadWrite(Vec::new()),
net: NetAccess::OutboundFull(None),
crypto: true,
child_process: true,
env: EnvAccess::Full,
allow_exit: true,
http_timeout_ms: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sealed_is_the_default() {
assert_eq!(Manifold::default(), Manifold::sealed());
}
#[test]
fn sealed_has_no_capabilities() {
let m = Manifold::sealed();
assert!(matches!(m.fs, FsAccess::None));
assert!(matches!(m.net, NetAccess::None));
assert!(!m.crypto);
assert!(!m.child_process);
assert!(matches!(m.env, EnvAccess::None));
assert!(!m.allow_exit);
}
#[test]
fn open_grants_everything() {
let m = Manifold::open();
assert!(matches!(m.fs, FsAccess::ReadWrite(_)));
assert!(matches!(m.net, NetAccess::OutboundFull(_)));
assert!(m.crypto);
assert!(m.child_process);
assert!(matches!(m.env, EnvAccess::Full));
assert!(m.allow_exit);
}
}