# Chess notation parser
Crate transforms algebraic chess notation into software readable structs and
vice versa. Parsed chess notation for each turn is stored within `Turn`
struct.
To parse a certain chess turn, such as `d2xe3`, store it in form of `&str` and
pass it as an argument into `Turn::try_from()` function.
`Turn` is an enum with two elements:
- `Castling` - a struct which describes *castling* turn
- `Move` - a struct which describes every other possible turn
## Example for `Castling` turn
#### `0-0` will be translated to:
```rust
Turn::Castling(Castling {
r#type: CastlingType::Short,
flags: Flag::NONE,
});
```
## Examples for `Move` turns
#### `d6` will be translated to:
```rust
Turn::Move (Move {
who: Piece::Pawn,
dst: Square::D6,
flags: Flag::NONE,
src: None,
promotion: None,
});
```
#### `d7xe8=B+?` will be translated to:
```rust
Turn::Move (Move {
who: Piece::Pawn,
dst: Square::E8,
flags: Flag::CHECK | Flag::CAPTURE,
src: Some(vec![Square::D7]),
promotion: Some(Piece::Bishop),
});
```
#### `Nab3#` will be translated to:
```rust
Turn::Move (Move {
who: Piece::Knight,
dst: Square::B3,
flags: Flag::CHECKMATE,
src: Some(Square::get_file('a').unwrap()), // Vector of 'Ax' squares
promotion: None,
});
```
# Chess notation parser rules
- **Square notation** should use lowercase alphabetic characters
- Valid: `a1`, `a2` ... `h7`, `h8`.
- **Castling notation** can be written with both `0` and `O`
- Valid example: `0-0-0` or `O-O`
- When `Castling` turn is printed out, it will be printed with `0`
notation
- Notation for **pieces**:
- `K`: King
- `Q`: Queen
- `R`: Rook
- `B`: Bishop
- `N`: Knight
- Pawns are indicated by the absence of the letter
- **Capture** is annotated with a lowercase `x` character
- Valid example: `Qxd3`
- **Check** is annotated with a `+` character
- Valid example: `Qd3+`
- **Checkmate** is annotated with a `#` character
- Valid example: `Qd3#`
- **Pawn promotion** is annoted with `=` symbol followed by a piece to which
pawn is promoted to
- Pawn promotion is valid only for ranks `8` and `1`
- Valid example: `g8=Q`
- Comments `??`, `!!`, `?`, `!`, `!?`, `?!` are allowed only at the end of
the turn
- Valid example: `a1=B??`
- Invalid example: `??a1=B`
# About
I don't really play chess that much, but I needed something to practice my Rust
skills, so this was sort of a fun project.
This particular crate was created for the purpose of [Pacifist chess
simulation](https://github.com/Rqnsom/pacifist-chess-simulation).