friendly_chess/chess/
piece.rs

1use super::constants::*;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub struct Piece {
5    pub piece_type: PieceType,
6    pub color: Color,
7}
8
9#[derive(PartialEq, Eq, Ord, PartialOrd, Copy, Clone, Debug, Hash)]
10#[repr(u8)]
11pub enum PieceType {
12    // EMPTY = 0,
13    PAWN = 1,
14    KNIGHT = 2,
15    BISHOP = 4,
16    ROOK = 8,
17    QUEEN = 16,
18    KING = 32,
19}
20
21impl PieceType {
22    /// Convert a `PieceType` enum to its associated value (u8)
23    pub fn to_value(&self) -> u8 {
24        *self as u8
25    }
26
27    /// Convert a value to its corresponding PieceType type
28    pub fn from_value(value: u8) -> Option<PieceType> {
29        match value {
30            // 0 => Some(PieceType::EMPTY),
31            1 => Some(PieceType::PAWN),
32            2 => Some(PieceType::KNIGHT),
33            4 => Some(PieceType::BISHOP),
34            8 => Some(PieceType::ROOK),
35            16 => Some(PieceType::QUEEN),
36            32 => Some(PieceType::KING),
37            _ => None,
38        }
39    }
40
41    pub fn from_string(value: &str) -> Option<PieceType> {
42        match value.to_lowercase().as_str() {
43            "p" => Some(PieceType::PAWN),
44            "n" => Some(PieceType::KNIGHT),
45            "b" => Some(PieceType::BISHOP),
46            "r" => Some(PieceType::ROOK),
47            "q" => Some(PieceType::QUEEN),
48            "k" => Some(PieceType::KING),
49            _ => None,
50        }
51    }
52
53    pub fn from_string_verbose(value: &str) -> Option<PieceType> {
54        match value.to_lowercase().as_str() {
55            "pawn" => Some(PieceType::PAWN),
56            "knight" => Some(PieceType::KNIGHT),
57            "bishop" => Some(PieceType::BISHOP),
58            "rook" => Some(PieceType::ROOK),
59            "queen" => Some(PieceType::QUEEN),
60            "king" => Some(PieceType::KING),
61            _ => None,
62        }
63    }
64
65    pub fn to_string(&self) -> Option<&str> {
66        use PieceType::*;
67
68        Some(match self {
69           PAWN => "p", 
70           KNIGHT=> "n", 
71           BISHOP=> "b", 
72           ROOK => "r", 
73           QUEEN => "q", 
74           KING=> "k", 
75        })
76    }
77
78    pub fn to_string_verbose(&self) -> Option<&str> {
79        use PieceType::*;
80
81        Some(match self {
82           PAWN => "pawn", 
83           KNIGHT=> "knight", 
84           BISHOP=> "bishop", 
85           ROOK => "rook", 
86           QUEEN => "queen", 
87           KING=> "king", 
88        })
89    }
90}