rudoku_core/sudoku/sudoku_value/
mod.rs1#[cfg(test)]
2mod tests;
3
4use rand::distributions::{Distribution, Standard};
5use std::convert::TryFrom;
6use super::Sudoku;
7
8#[derive(PartialEq, Eq, PartialOrd, Ord, Debug, Copy, Clone)]
10pub enum SudokuValue {
11 Empty = 0,
12 One,
13 Two,
14 Three,
15 Four,
16 Five,
17 Six,
18 Seven,
19 Eight,
20 Nine
21}
22
23impl SudokuValue {
24 pub fn get_number_array() -> [SudokuValue; 9] {
25 [SudokuValue::One, SudokuValue::Two, SudokuValue::Three, SudokuValue::Four, SudokuValue::Five, SudokuValue::Six, SudokuValue::Seven, SudokuValue::Eight, SudokuValue::Nine]
26 }
27
28 pub fn get_number_vec() -> Vec<SudokuValue> {
29 vec![SudokuValue::One, SudokuValue::Two, SudokuValue::Three, SudokuValue::Four, SudokuValue::Five, SudokuValue::Six, SudokuValue::Seven, SudokuValue::Eight, SudokuValue::Nine]
30 }
31}
32
33impl std::fmt::Display for SudokuValue {
34 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
35 match self {
36 SudokuValue::Empty => write!(f, " "),
37 num => write!(f, "{}", (*num as i32))
38 }
39 }
40}
41
42impl Iterator for SudokuValue {
43 type Item = SudokuValue;
44 fn next(&mut self) -> Option<SudokuValue> {
45 match self {
46 SudokuValue::Empty => None,
47 SudokuValue::Nine => None,
48 _ => {
49 let num = *self as i32 + 1;
50 *self = SudokuValue::try_from(num).unwrap();
51 Some(*self)
52 }
53 }
54 }
55}
56
57impl Distribution<SudokuValue> for Standard {
59 fn sample<R: rand::Rng + ?Sized>(&self, rng: &mut R) -> SudokuValue {
60 SudokuValue::try_from(rng.gen_range(1..=9)).unwrap()
61 }
62}
63
64impl TryFrom<i32> for SudokuValue {
65 type Error = &'static str;
66
67 fn try_from(num: i32) -> Result<Self, Self::Error> {
69 match num {
70 0 => Ok(SudokuValue::Empty),
71 1 => Ok(SudokuValue::One),
72 2 => Ok(SudokuValue::Two),
73 3 => Ok(SudokuValue::Three),
74 4 => Ok(SudokuValue::Four),
75 5 => Ok(SudokuValue::Five),
76 6 => Ok(SudokuValue::Six),
77 7 => Ok(SudokuValue::Seven),
78 8 => Ok(SudokuValue::Eight),
79 9 => Ok(SudokuValue::Nine),
80 _ => Err("SudokuValue has to be in the range 0..=9")
81 }
82 }
83}