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
//! Tools for analyzing chess positions and building chess software in Rust.
//!
//! `crabchess` is a 100% Rust Chess API with no `unsafe` code that enables you to build
//! chess-related software tools. `crabchess` can import and export PGNs (Portable Game Notation)
//! and FENs (Forsyth-Edwards Notation), determine the status of a game of chess, identify illegal
//! move attempts, determine a game's ECO opening, track players' time remaining, and much more.
//! `crabchess` works not only with standard chess but also random board configurations like
//! Fischer random chess (Chess960).
//!
//! ## Example
//!
//! Most of the core functionality is exposed through the `ChessPosition` struct, which represents
//! a game of chess. The `ChessPosition` struct can be mutated and consulted as a game progresses.
//!
//! ```
//! use crabchess::prelude::*;
//!
//! // Create board with default (Staunton) starting position.
//! let mut position = ChessPosition::new();
//!
//! // Apply moves in SAN format.
//! position
//! .apply_sans("e4 e6 Nf3 g6 d4 Bg7 e5 Ne7 g4".split(' '))
//! .unwrap();
//!
//! // Or, use the `Move` enum.
//! position
//! .apply_move(Move::Castle {
//! side: Side::Kingside,
//! color: Color::Black,
//! timer_update: None,
//! })
//! .unwrap();
//!
//! assert_eq!(
//! position.fen(),
//! "rnbq1rk1/ppppnpbp/4p1p1/4P3/3P2P1/5N2/PPP2P1P/RNBQKB1R w KQ - 1 6"
//! );
//!
//! position
//! .apply_move(Move::Standard {
//! initial_square: sq!(F3),
//! piece_type: Type::Knight,
//! piece_color: Color::White,
//! final_square: sq!(G5),
//! is_capture: false,
//! timer_update: None,
//! })
//! .unwrap();
//! ```
use MiMalloc;
static GLOBAL: MiMalloc = MiMalloc;