reifydb_engine/procedure/
wasm_loader.rs1use std::{fs, path::Path};
7
8use reifydb_sdk::error::FFIError;
9use reifydb_type::Result;
10
11use super::{
12 registry::{Procedures, ProceduresBuilder},
13 wasm::WasmProcedure,
14};
15
16pub fn load_wasm_procedures_from_dir(dir: &Path) -> Result<Procedures> {
21 Ok(register_wasm_procedures_from_dir(dir, Procedures::builder())?.build())
22}
23
24pub fn register_wasm_procedures_from_dir(dir: &Path, mut builder: ProceduresBuilder) -> Result<ProceduresBuilder> {
27 let entries = fs::read_dir(dir).map_err(|e| {
28 FFIError::Other(format!("Failed to read WASM procedure directory {}: {}", dir.display(), e))
29 })?;
30
31 for entry in entries {
32 let entry = entry.map_err(|e| FFIError::Other(format!("Failed to read directory entry: {}", e)))?;
33 let path = entry.path();
34
35 if path.extension().and_then(|s| s.to_str()) != Some("wasm") {
36 continue;
37 }
38
39 let name = match path.file_stem().and_then(|s| s.to_str()) {
40 Some(n) => n.to_string(),
41 None => continue,
42 };
43
44 let wasm_bytes = fs::read(&path)
45 .map_err(|e| FFIError::Other(format!("Failed to read WASM file {}: {}", path.display(), e)))?;
46
47 let name_for_closure = name.clone();
48 builder = builder.with_procedure(&name, move || {
49 WasmProcedure::new(name_for_closure.clone(), wasm_bytes.clone())
50 });
51 }
52
53 Ok(builder)
54}