chess-notation-parser 0.2.2

Algebraic chess notation parser
Documentation
# 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).