1use crate::types;
2
3pub fn parse_fen(fen_string: &str) -> Vec<Vec<types::Piece>> {
4 let array = fen_string.split("/").collect::<Vec<&str>>();
5 let mut board: Vec<Vec<types::Piece>> = vec![];
6
7 for x in 0..8 {
8 board.push(vec![]);
9 for _ in 0..8 {
10 board[x].push(types::Piece::Empty);
11 }
12 }
13
14 let mut line_offset: usize = 0;
15 for line in array {
16 let mut offset: usize = 0;
17 for piece in line.chars() {
18 let piece_color: types::PieceColor = if piece.is_ascii_uppercase() { types::PieceColor::White } else { types::PieceColor::Black };
19
20 match piece.to_ascii_lowercase() {
21 'p' => board[offset][line_offset] = types::Piece::Pawn(piece_color),
22 'r' => board[offset][line_offset] = types::Piece::Rook(piece_color),
23 'n' => board[offset][line_offset] = types::Piece::Knight(piece_color),
24 'b' => board[offset][line_offset] = types::Piece::Bishop(piece_color),
25 'q' => board[offset][line_offset] = types::Piece::Queen(piece_color),
26 'k' => board[offset][line_offset] = types::Piece::King(piece_color),
27 x => {
28 if !x.is_numeric() {
29 panic!("Invalid FEN string at: {}", x);
30 }
31
32 let skip: i32 = x.to_string().parse::<i32>().unwrap();
33
34
35 for _ in 0..skip {
36 board[offset][line_offset] = types::Piece::Empty;
37 offset += 1;
38 }
39 }
40 }
41
42 if ['r', 'n', 'b', 'q', 'k', 'p'].contains(&piece.to_ascii_lowercase()) {
43 offset += 1;
44 }
45 }
46
47 line_offset += 1;
48 }
49
50 for x in 0..8 {
51 for y in 0..8 {
52 match &board[x][y] {
53 types::Piece::Empty => print!("( )"),
54 types::Piece::Pawn(color) => print!("({})", match color {
55 types::PieceColor::White => "P",
56 types::PieceColor::Black => "p"
57 }),
58 types::Piece::Rook(color) => print!("({})", match color {
59 types::PieceColor::White => "R",
60 types::PieceColor::Black => "r"
61 }),
62 types::Piece::Knight(color) => print!("({})", match color {
63 types::PieceColor::White => "N",
64 types::PieceColor::Black => "n"
65 }),
66 types::Piece::Bishop(color) => print!("({})", match color {
67 types::PieceColor::White => "B",
68 types::PieceColor::Black => "b"
69 }),
70 types::Piece::Queen(color) => print!("({})", match color {
71 types::PieceColor::White => "Q",
72 types::PieceColor::Black => "q"
73 }),
74 types::Piece::King(color) => print!("({})", match color {
75 types::PieceColor::White => "K",
76 types::PieceColor::Black => "k"
77 })
78 }
79 }
80 println!();
81 }
82
83 board
84}