pub trait Permission: 'static {
#[doc(hidden)]
type __CapsecSeal: __private::SealToken;
}
pub struct FsRead;
pub struct FsWrite;
pub struct FsAll;
pub struct NetConnect;
pub struct NetBind;
pub struct NetAll;
pub struct EnvRead;
pub struct EnvWrite;
pub struct Spawn;
pub struct Ambient;
impl Permission for FsRead {
type __CapsecSeal = __private::SealProof;
}
impl Permission for FsWrite {
type __CapsecSeal = __private::SealProof;
}
impl Permission for FsAll {
type __CapsecSeal = __private::SealProof;
}
impl Permission for NetConnect {
type __CapsecSeal = __private::SealProof;
}
impl Permission for NetBind {
type __CapsecSeal = __private::SealProof;
}
impl Permission for NetAll {
type __CapsecSeal = __private::SealProof;
}
impl Permission for EnvRead {
type __CapsecSeal = __private::SealProof;
}
impl Permission for EnvWrite {
type __CapsecSeal = __private::SealProof;
}
impl Permission for Spawn {
type __CapsecSeal = __private::SealProof;
}
impl Permission for Ambient {
type __CapsecSeal = __private::SealProof;
}
impl<A: Permission, B: Permission> Permission for (A, B) {
type __CapsecSeal = __private::SealProof;
}
pub trait Subsumes<P: Permission>: Permission {}
impl Subsumes<FsRead> for FsAll {}
impl Subsumes<FsWrite> for FsAll {}
impl Subsumes<NetConnect> for NetAll {}
impl Subsumes<NetBind> for NetAll {}
impl<P: Permission> Subsumes<P> for Ambient {}
#[doc(hidden)]
pub mod __private {
pub struct SealProof(());
pub trait SealToken {}
impl SealToken for SealProof {}
#[doc(hidden)]
pub const fn __capsec_seal() -> SealProof {
SealProof(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::mem::size_of;
#[test]
fn all_permissions_are_zst() {
assert_eq!(size_of::<FsRead>(), 0);
assert_eq!(size_of::<FsWrite>(), 0);
assert_eq!(size_of::<FsAll>(), 0);
assert_eq!(size_of::<NetConnect>(), 0);
assert_eq!(size_of::<NetBind>(), 0);
assert_eq!(size_of::<NetAll>(), 0);
assert_eq!(size_of::<EnvRead>(), 0);
assert_eq!(size_of::<EnvWrite>(), 0);
assert_eq!(size_of::<Spawn>(), 0);
assert_eq!(size_of::<Ambient>(), 0);
}
fn _assert_subsumes<Super: Subsumes<Sub>, Sub: Permission>() {}
#[test]
fn tuple_permission_is_zst() {
assert_eq!(size_of::<(FsRead, NetConnect)>(), 0);
}
#[test]
fn subsumption_relationships() {
_assert_subsumes::<FsAll, FsRead>();
_assert_subsumes::<FsAll, FsWrite>();
_assert_subsumes::<NetAll, NetConnect>();
_assert_subsumes::<NetAll, NetBind>();
_assert_subsumes::<Ambient, FsRead>();
_assert_subsumes::<Ambient, NetConnect>();
_assert_subsumes::<Ambient, Spawn>();
}
}