Skip to main content

reifydb_engine/transform/
wasm_loader.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2// Copyright (c) 2025 ReifyDB
3
4//! WASM transform loader — scans a directory for `.wasm` files and builds a transform registry
5
6use std::{fs, path::Path};
7
8use reifydb_sdk::error::FFIError;
9use reifydb_type::Result;
10
11use super::{registry::Transforms, wasm::WasmTransform};
12
13/// Scan a directory for `.wasm` files, read each one, and return a `Transforms`
14/// registry with factory functions that create `WasmTransform` instances.
15///
16/// The transform name is derived from the file stem (e.g. `my_transform.wasm` → `"my_transform"`).
17pub fn load_transforms_from_dir(dir: &Path) -> Result<Transforms> {
18	let entries = fs::read_dir(dir).map_err(|e| {
19		FFIError::Other(format!("Failed to read WASM transform directory {}: {}", dir.display(), e))
20	})?;
21
22	let mut builder = Transforms::builder();
23
24	for entry in entries {
25		let entry = entry.map_err(|e| FFIError::Other(format!("Failed to read directory entry: {}", e)))?;
26		let path = entry.path();
27
28		if path.extension().and_then(|s| s.to_str()) != Some("wasm") {
29			continue;
30		}
31
32		let name = match path.file_stem().and_then(|s| s.to_str()) {
33			Some(n) => n.to_string(),
34			None => continue,
35		};
36
37		let wasm_bytes = fs::read(&path)
38			.map_err(|e| FFIError::Other(format!("Failed to read WASM file {}: {}", path.display(), e)))?;
39
40		let name_for_closure = name.clone();
41		builder = builder
42			.register(&name, move || WasmTransform::new(name_for_closure.clone(), wasm_bytes.clone()));
43	}
44
45	Ok(builder.build())
46}