# eschac A library for computing chess moves. ## Overview eschac implements fast legal move generation and a copy-make interface that enforces at compile time that no illegal move is played, with no runtime checks and no potential panics. ## Example ```rust use eschac::prelude::*; // read a position from a text record let setup = "7k/4P1rp/5Q2/5p2/1Pp1bP2/8/r4K1P/6R1 w - -".parse::()?; let position = setup.validate()?; // read a move in algebraic notation let san = "Ke1".parse::()?; let m = san.to_move(&position)?; // play the move (note the absence of error handling) let position = m.make(); // generate all the legal moves on the new position let moves = position.legal_moves(); for m in moves { // print the UCI notation of each move println!("{}", m.to_uci()); } ``` ## Comparison with [shakmaty](https://crates.io/crates/shakmaty) shakmaty is another Rust library for chess processing. It is written by Niklas Fiekas, whose work greatly inspired the development of eschac. For most purposes, shakmaty is probably a better option, as eschac comes short of its miriad of features. Both libraries have the same core features: - vocabulary to describe the chessboard (squares, pieces, etc.) - parsing and editing positions - parsing standard move notations - fast legal move generation and play **eschac** distinguishes itself with: - a focus on performance - a more compact board representation - its use of the borrow checker to guarantee only legal moves are played **shakmaty** will be more suitable for a lot of applications, with: - vocabulary to describe and work with games, not just positions - insufficient material detection - PGN parsing - Zobrist hashing - Syzygy endgame tablebases - chess960 and other variants - etc. ## License eschac is licensed under [AGPL-3.0](./COPYING) (or any later version at your option).