# Board Game Parser ## Overview The **Board Game Parser** is a Rust-based utility designed to parse structured information about board games and convert it into a serialized JSON format. This tool processes text files containing data about board games and extracts details such as the game's name, author, age suitability, playtime, player count, and price. ## Features - Parses text files with structured board game data. - Outputs data as a JSON file. - Supports flexible input with various whitespace formatting. ## Parsing Details ### Input Format The parser expects an input file with the following structure: ``` Name: Author: Age: Time: - Players: - Price: ``` - **`Name:`** The name of the board game. - **`Author:`** The creator or publisher of the game. - **`Age:`** Minimum age requirement for the game. - **`Time:`** Expected playtime, with optional range (e.g., `30-60` minutes). - **`Players:`** Minimum and maximum player count. - **`Price:`** Cost of the game, with optional currency (`UAH`, `USD`, `EUR`). Example: ``` Name: Chess Author: Unknown Age: 6 Time: 10-60 Players: 2 Price: 20 USD ``` ### Parsing Process 1. **Grammar Definition**: The grammar is defined in `grammar.pest` using the [Pest parser](https://pest.rs/). It uses rules for: - Capturing sections such as `Name`, `Author`, `Age`, etc. - Handling optional whitespace and ranges. 2. **Data Extraction**: The parser tokenizes input based on these rules and extracts relevant fields. Each game entry is represented as a `Pair` object in Pest, which is then converted to a `Game` struct using the `from_pair` method. 3. **Serialization**: The extracted data is serialized into JSON format using the [Serde](https://serde.rs/) library. ### Output Format The resulting JSON file contains an array of board games, each represented as an object with the following structure: ```json [ { "name": "Chess", "author": "Unknown", "age": 6, "min_time": 10, "max_time": 60, "min_players": 2, "max_players": null, "price": 20.0 } ] ``` ## Usage ### Commands 1. Parse a file: ```bash cargo run -- ``` Example: ```bash cargo run input.txt output.json ``` 2. Display credits: ```bash cargo run -- --credits ``` 3. Display help: ```bash cargo run -- --help ``` ### Examples - Input file: ``` Name: Catan Author: Klaus Teuber Age: 10 Time: 60-120 Players: 3-4 Price: 30 USD ``` - Command: ```bash cargo run input.txt output.json ``` - Output file (`output.json`): ```json [ { "name": "Catan", "author": "Klaus Teuber", "age": 10, "min_time": 60, "max_time": 120, "min_players": 3, "max_players": 4, "price": 30.0 } ] ``` ## Technical Details This project leverages: - **Pest**: For defining the parsing grammar and tokenizing input. - **Serde**: For serialization and deserialization of parsed data. - **Anyhow**: For improved error handling. ## Author - Maksym Karpinskyi (karpinskyimaksym@gmail.com) ## License MIT License