diff --git a/stdlib/src/canvas.rs b/stdlib/src/canvas.rs index d7dee547..502f5ac3 100644 --- a/stdlib/src/canvas.rs +++ b/stdlib/src/canvas.rs @@ -3,7 +3,10 @@ use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc; use techscript_runtime::{ - context::RuntimeContext, error::RuntimeError, function::Callable, value::RuntimeValue, + context::{Capability, RuntimeContext}, + error::RuntimeError, + function::Callable, + value::RuntimeValue, }; /// Convert a DslBlockValue to SVG string. @@ -271,7 +274,7 @@ impl Callable for CanvasFn { } fn call( &self, - _ctx: &mut RuntimeContext, + ctx: &mut RuntimeContext, args: Vec, ) -> Result { let mut buf = self.buffer.borrow_mut(); @@ -361,6 +364,15 @@ impl Callable for CanvasFn { Ok(RuntimeValue::Null) } CanvasOp::Save => { + if !ctx.config.capabilities.contains(&Capability::FileSystem) { + return Err(RuntimeError::new( + techscript_runtime::error::RuntimeErrorKind::InvalidOperation( + "FileSystem capability is required to save canvas".to_string(), + ), + None, + None, + )); + } let path = args[0].to_string(); let content = buf.clone(); std::fs::write(&path, &content).map_err(|e| { @@ -659,7 +671,7 @@ impl StdlibRegistry { name: "std.canvas".to_string(), version: "1.0.0".to_string(), exports, - required_capabilities: Vec::new(), + required_capabilities: vec![Capability::FileSystem], }, ); }