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 { 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)) } }