1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
extern crate console_error_panic_hook;
use std::panic;

use types::SolutionType;
use wasm_bindgen::prelude::*;
use gloo_utils::format::JsValueSerdeExt;

pub mod solver;
pub mod types;

#[wasm_bindgen]
pub fn wasm_check_solved(js_constraints: JsValue, js_grid: JsValue) -> JsValue {
  panic::set_hook(Box::new(console_error_panic_hook::hook));
  let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
  let grid: types::SudokuGrid = js_grid.into_serde().unwrap();
  let solver = solver::Solver::new(constraints, Some(grid));
  let result = solver.check_solved();
  JsValue::from_serde(&result).unwrap()
}

#[wasm_bindgen]
pub fn wasm_logical_solve(js_constraints: JsValue) -> JsValue {
  panic::set_hook(Box::new(console_error_panic_hook::hook));
  let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
  let mut solver = solver::Solver::new(constraints, None);
  let result = solver.logical_solve();
  JsValue::from_serde(&result).unwrap()
}

#[wasm_bindgen]
pub fn wasm_brute_solve(js_constraints: JsValue) -> JsValue {
  panic::set_hook(Box::new(console_error_panic_hook::hook));
  let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
  let mut solver = solver::Solver::new(constraints, None);
  let result = solver.brute_solve(true);
  JsValue::from_serde(&result).unwrap()
}

#[wasm_bindgen]
pub fn wasm_logical_hint(js_constraints: JsValue) -> JsValue {
  panic::set_hook(Box::new(console_error_panic_hook::hook));
  let constraints: types::SudokuConstraints = js_constraints.into_serde().unwrap();
  let mut solver = solver::Solver::new(constraints.clone(), None);
  let result = solver.logical_solve();

  // Make sure there is a valid solution first
  if result.solution_type != SolutionType::Full {
    return JsValue::from_serde(&result).unwrap();
  }

  // Get the first relevant steps
  let mut solver = solver::Solver::new(constraints.clone(), None)
    .with_hint_mode();
  let result = solver.logical_solve();

  JsValue::from_serde(&result).unwrap()
}