# 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 = Setup::from_text_record("7k/4P1rp/5Q2/5p2/1Pp1bP2/8/r4K1P/6R1 w - -")?;
let position = setup.into_position()?;

// read a move in algebraic notation
let san = "Ke1".parse::<San>()?;
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).
