From ed55cda68e560317fe392cf26af01f009d06e1e7 Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Mon, 22 Sep 2025 12:47:56 +0300 Subject: [PATCH] feat: add manifest skelet --- Cargo.toml | 12 ++++++++++ examples/manifest.json | 13 +++++++++++ src/lib.rs | 51 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 examples/manifest.json diff --git a/Cargo.toml b/Cargo.toml index 71aeea5..2c659f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,15 @@ keywords = ["wasm", "sandbox", "capabilities", "plugins", "traces"] categories = ["cryptography::randomness", "encoding"] [dependencies] +color-eyre = "0.6" +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[dev-dependencies] +claims = "0.8" + +[lints.clippy] +pedantic = "warn" +nursery = "warn" +unwrap_used = "warn" +expect_used = "warn" diff --git a/examples/manifest.json b/examples/manifest.json new file mode 100644 index 0000000..0741f69 --- /dev/null +++ b/examples/manifest.json @@ -0,0 +1,13 @@ +{ + "plugin": "formatter-v1", + "version": "0.1", + "capabilities": { + "fs": { + "read": [ + "./workspace/*" + ], + "write": [] + } + }, + "issued_by": "dev-team" +} diff --git a/src/lib.rs b/src/lib.rs index b93cf3f..3cad0f7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,55 @@ -pub fn add(left: u64, right: u64) -> u64 { - left + right +use std::fs::read_to_string; + +use color_eyre::eyre::Result; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct FsCapability { + pub read: Vec, // Glob patter for read + pub write: Vec, // Stub for now +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum Capability { + Fs(FsCapability), + // TODO: add Net, Cpu +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Capabilities { + pub fs: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct CapabilityManifest { + pub plugin: String, + pub version: String, + pub capabilities: Capabilities, + pub issued_by: String, + // TODO: add signature +} + +pub fn load_manifest(path: &str) -> Result { + let json_str = read_to_string(path)?; + let manifest = serde_json::from_str(&json_str)?; + Ok(manifest) } #[cfg(test)] mod tests { use super::*; + use claims::assert_some; #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); + fn manifest_loader() { + let manifest = load_manifest("examples/manifest.json").expect("Load failed"); + assert_eq!(manifest.plugin, "formatter-v1"); + assert_eq!(manifest.version, "0.1"); + assert_eq!(manifest.issued_by, "dev-team"); + + let caps = manifest.capabilities; + let fs_cap = assert_some!(caps.fs); + assert_eq!(fs_cap.read, vec!["./workspace/*"]); + assert!(fs_cap.write.is_empty()); } }