reifydb_engine/transform/
wasm_loader.rs1use std::{fs, path::Path};
7
8use reifydb_sdk::error::FFIError;
9use reifydb_type::Result;
10
11use super::{registry::Transforms, wasm::WasmTransform};
12
13pub 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}