From ee05af89f44374423f322181ad0880047a195875 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 8 Sep 2026 08:19:03 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=92=20Fix=20missing=20capability=20che?= =?UTF-8?q?ck=20in=20CanvasOp::Save?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added `Capability::FileSystem` check in `stdlib/src/canvas.rs` before saving a canvas to the filesystem. Updated the module registry to declare the required capability. Co-authored-by: Tcode-Motion <188012755+Tcode-Motion@users.noreply.github.com> --- stdlib/src/canvas.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) 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], }, ); }