aboutsummaryrefslogtreecommitdiff
path: root/src/square.rs
blob: e518a9227a90915ff9225f393de96e41bcb5a844 (plain)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use std::str::Chars;

use crate::bitboard::Bitboard;

/// Aliases to board square indexes
#[allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, num_enum::FromPrimitive)]
#[repr(u8)]
pub enum Square {
  #[default]
  A1, B1, C1, D1, E1, F1, G1, H1,
  A2, B2, C2, D2, E2, F2, G2, H2,
  A3, B3, C3, D3, E3, F3, G3, H3,
  A4, B4, C4, D4, E4, F4, G4, H4,
  A5, B5, C5, D5, E5, F5, G5, H5,
  A6, B6, C6, D6, E6, F6, G6, H6,
  A7, B7, C7, D7, E7, F7, G7, H7,
  A8, B8, C8, D8, E8, F8, G8, H8,
}
impl Square {
    pub fn from_coords(rank: u8, file: u8) -> Self {
        Self::from(rank * 8 + file)
    }

    pub fn to_bitboard(&self) -> Bitboard {
        1u64 << *self as u8
    }
    /// 0-based rank
    pub fn rank(&self) -> u8 {
        *self as u8 / 8
    }
    /// 0-based file
    pub fn file(&self) -> u8 {
        *self as u8 % 8
    }

    pub fn nort_one(&self) -> Self {
        Self::from(*self as u8 + 8)
    }

    pub fn sout_one(&self) -> Self {
        Self::from(*self as u8 - 8)
    }

    /// Warning: this wraps which is not what you might expect!
    pub fn west_one(&self) -> Self {
        Self::from(*self as u8 - 1)
    }

    /// Warning: this wraps which is not what you might expect!
    pub fn east_one(&self) -> Self {
        Self::from(*self as u8 + 1)
    }

    pub fn from_notation(chars: &mut Chars) -> Result<Self, String> {
        let file = match chars.next() {
            Some(ch) => {
                match ch {
                    'a' => 0,
                    'b' => 1,
                    'c' => 2,
                    'd' => 3,
                    'e' => 4,
                    'f' => 5,
                    'g' => 6,
                    'h' => 7,
                    _ => return Err(String::from("Incorrect file!"))
                }
            },
            None => return Err(String::from("Missing file"))
        };
        let rank = match chars.next() {
            Some(ch) => {
                match ch.to_digit(10) {
                    Some(digit) => digit - 1,
                    None => return Err(String::from("Incorrect rank"))
                }
            }
            None => return Err(String::from("Missing rank"))
        };

        Ok(Self::from_coords(rank as u8, file))
    }
}