1extern crate console_error_panic_hook;
2
3use types::SolutionType;
4use wasm_bindgen::prelude::*;
5use gloo_utils::format::JsValueSerdeExt;
6
7pub mod solver;
8pub mod types;
9
10#[wasm_bindgen]
11pub fn wasm_check_solved(js_constraints: JsValue, js_grid: JsValue) -> JsValue {
12 console_error_panic_hook::set_once();
15
16 let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
17 let grid: types::SudokuGrid = js_grid.into_serde().unwrap();
18 let solver = solver::Solver::new(constraints, Some(grid));
19 let result = solver.check_solved();
20 JsValue::from_serde(&result).unwrap()
21}
22
23#[wasm_bindgen]
24pub fn wasm_logical_solve(js_constraints: JsValue) -> JsValue {
25 console_error_panic_hook::set_once();
28
29 let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
30 let mut solver = solver::Solver::new(constraints, None);
31 let result = solver.logical_solve();
32 JsValue::from_serde(&result).unwrap()
33}
34
35#[wasm_bindgen]
36pub fn wasm_brute_solve(js_constraints: JsValue) -> JsValue {
37 console_error_panic_hook::set_once();
40
41 let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
42 let mut solver = solver::Solver::new(constraints, None);
43 let result = solver.brute_solve(true);
44 JsValue::from_serde(&result).unwrap()
45}
46
47#[wasm_bindgen]
48pub fn wasm_logical_hint(js_constraints: JsValue) -> JsValue {
49 console_error_panic_hook::set_once();
52
53 let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
54 let mut solver = solver::Solver::new(constraints.clone(), None);
55 let result = solver.logical_solve();
56
57 if result.solution_type != SolutionType::Full {
59 return JsValue::from_serde(&result).unwrap();
60 }
61
62 let mut solver = solver::Solver::new(constraints.clone(), None)
64 .with_hint_mode(true);
65 let result = solver.logical_solve();
66
67 JsValue::from_serde(&result).unwrap()
68}