# ♔♕♖♗♘♙ 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.