# ♔♕♖♗♘♙ crabchess `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). ## Documentation The full documentation is available at [docs.rs](https://docs.rs/crabchess/latest/crabchess/). ## 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. ```rust 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(); ``` ## License This project is licensed under the MIT License - see the LICENSE file for details.