rudoku_core/sudoku/sudoku_value/
mod.rs

1#[cfg(test)]
2mod tests;
3
4use rand::distributions::{Distribution, Standard};
5use std::convert::TryFrom;
6use super::Sudoku;
7
8/// [Sudoku] is filled with SudokuValue
9#[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
57/// Only generates number values, not [SudokuValue::Empty].
58impl 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    /// 0 corresponds to [SudokuValue::Empty], the other numbers 1..=9 correspond to their SudokuValue.
68    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}