use wasm_bindgen::prelude::*;
use crate::DEFAULT_BUILDING_BLOCKS;
use crate::chem_env::{ChemEnv, default_rules};
use crate::search::{SearchConfig, find_routes as rs_find_routes};
#[wasm_bindgen]
pub fn find_routes(target: &str, depth: u32, max_routes: usize, beam_width: usize) -> String {
let env = ChemEnv::in_memory(DEFAULT_BUILDING_BLOCKS);
let rules = default_rules();
let config = SearchConfig {
max_depth: depth,
max_routes,
beam_width,
..Default::default()
};
match rs_find_routes(target, &env, &rules, &config) {
Ok((routes, stats)) => {
let output = if routes.is_empty() {
serde_json::json!({
"target": target,
"routes_found": 0,
"routes": [],
"diagnostics": {"nodes_expanded": stats.nodes_expanded}
})
} else {
serde_json::json!({
"target": target,
"routes_found": routes.len(),
"routes": routes,
})
};
serde_json::to_string(&output)
.unwrap_or_else(|e| format!(r#"{{"error":"serialization: {e}"}}"#))
}
Err(e) => format!(r#"{{"error":"{e}"}}"#),
}
}
#[wasm_bindgen]
pub fn version() -> String {
env!("CARGO_PKG_VERSION").to_string()
}