use crate::contract::capability::{Enforcement, EvidenceClaim, SupportVerdict};
use crate::contract::support::{RequirementKind, SupportMatrix};
use std::collections::BTreeMap;
#[must_use]
pub fn support_matrix() -> SupportMatrix {
let mut best = BTreeMap::new();
insert(
&mut best,
RequirementKind::LaunchWorkload,
Enforcement::Enforced,
&[EvidenceClaim::TerminalOutcome],
);
insert(
&mut best,
RequirementKind::CaptureStreams,
Enforcement::Enforced,
&[EvidenceClaim::CapturedStreams],
);
insert(
&mut best,
RequirementKind::Filesystem,
Enforcement::Enforced,
&[
EvidenceClaim::AllowedActions,
EvidenceClaim::FilesystemDelta,
EvidenceClaim::MechanismAttestation,
],
);
insert(
&mut best,
RequirementKind::Environment,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::TempRoot,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::CommitArtifact,
Enforcement::Enforced,
&[EvidenceClaim::ArtifactLineage],
);
insert(
&mut best,
RequirementKind::DiscardArtifact,
Enforcement::Enforced,
&[EvidenceClaim::ArtifactLineage],
);
insert(
&mut best,
RequirementKind::ListOutputs,
Enforcement::Enforced,
&[EvidenceClaim::ArtifactLineage],
);
insert(
&mut best,
RequirementKind::NetworkDenyAll,
Enforcement::Enforced,
&[EvidenceClaim::DeniedAttempts],
);
insert(
&mut best,
RequirementKind::InheritedFdsNone,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::InheritedFdsOnly,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::ChildSpawnDenyNewTasks,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::ChildSpawnAllowThreads,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::ChildSpawnAllowDescendants,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::Kill,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::ExposePath,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::NetworkAllowList,
Enforcement::Unsupported,
&[],
);
SupportMatrix::from_best_case(best)
}
fn insert(
table: &mut BTreeMap<RequirementKind, SupportVerdict>,
kind: RequirementKind,
enforcement: Enforcement,
evidence: &[EvidenceClaim],
) {
table.insert(
kind,
SupportVerdict::new(enforcement, evidence.iter().copied().collect()),
);
}
#[cfg(feature = "backend-wasm")]
mod backend_impl;
#[cfg(feature = "backend-wasm")]
pub use backend_impl::WasmBackend;
#[cfg(test)]
mod tests {
use super::support_matrix;
use crate::contract::capability::Enforcement;
use crate::contract::support::RequirementKind;
#[test]
fn spawn_kill_mount_and_allow_list_are_structurally_unsupported() {
let m = support_matrix();
for kind in [
RequirementKind::ChildSpawnDenyNewTasks,
RequirementKind::ChildSpawnAllowThreads,
RequirementKind::ChildSpawnAllowDescendants,
RequirementKind::Kill,
RequirementKind::ExposePath,
RequirementKind::NetworkAllowList,
] {
assert_eq!(
m.best_case_for(kind).enforcement,
Enforcement::Unsupported,
"{kind:?} must be structurally Unsupported on wasm"
);
}
}
#[test]
fn filesystem_is_enforced_via_preopen() {
let m = support_matrix();
assert_eq!(
m.best_case_for(RequirementKind::Filesystem).enforcement,
Enforcement::Enforced
);
}
}