use pyo3::prelude::*;
mod config;
mod csp;
mod enums;
pub mod errors;
mod sudoku;
pub use config::{CancelToken, SolveConfig, SolveStats};
pub use csp::Csp;
pub use enums::{Ordering, Pruning};
pub use errors::{BudgetExceededError, CspTimeoutError, InvalidInputError, UnsatisfiableError};
pub use sudoku::{
SudokuCSP, SudokuDifficulty, create_random_board, create_sudoku_csp, solve_sudoku,
};
#[pymodule]
pub fn csp_solver(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<Pruning>()?;
m.add_class::<Ordering>()?;
m.add_class::<SolveConfig>()?;
m.add_class::<SolveStats>()?;
m.add_class::<CancelToken>()?;
m.add_class::<Csp>()?;
m.add_class::<SudokuDifficulty>()?;
m.add_class::<SudokuCSP>()?;
m.add_function(wrap_pyfunction!(create_sudoku_csp, m)?)?;
m.add_function(wrap_pyfunction!(solve_sudoku, m)?)?;
m.add_function(wrap_pyfunction!(create_random_board, m)?)?;
m.add(
"UnsatisfiableError",
m.py().get_type::<UnsatisfiableError>(),
)?;
m.add(
"BudgetExceededError",
m.py().get_type::<BudgetExceededError>(),
)?;
m.add("InvalidInputError", m.py().get_type::<InvalidInputError>())?;
m.add("CspTimeoutError", m.py().get_type::<CspTimeoutError>())?;
Ok(())
}