use wasm_bindgen::prelude::*;
use crate::DEFAULT_BUILDING_BLOCKS;
use crate::chem_env::{self, 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 find_routes_v2(
target: &str,
depth: u32,
max_routes: usize,
beam_width: usize,
avoid_elements: &str,
require_elements: &str,
) -> String {
let env = ChemEnv::in_memory(DEFAULT_BUILDING_BLOCKS);
let rules = default_rules();
let config = SearchConfig {
max_depth: depth,
max_routes,
beam_width,
forbidden_elements: chem_env::elem_symbols_to_mask(avoid_elements),
required_element_present: chem_env::elem_symbols_to_mask(require_elements),
..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()
}
#[wasm_bindgen]
pub fn capabilities() -> String {
let env = ChemEnv::in_memory(DEFAULT_BUILDING_BLOCKS);
serde_json::json!({
"building_blocks": env.bb_count(),
"reaction_rules": default_rules().len(),
})
.to_string()
}