lisudoku_solver/
lib.rs

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  // panic::set_hook(Box::new(console_error_panic_hook::hook));
13  // Try this instead
14  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  // panic::set_hook(Box::new(console_error_panic_hook::hook));
26  // Try this instead
27  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  // panic::set_hook(Box::new(console_error_panic_hook::hook));
38  // Try this instead
39  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  // panic::set_hook(Box::new(console_error_panic_hook::hook));
50  // Try this instead
51  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  // Make sure there is a valid solution first
58  if result.solution_type != SolutionType::Full {
59    return JsValue::from_serde(&result).unwrap();
60  }
61
62  // Get the first relevant steps
63  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}