# My YAML Parser
A Rust program for parsing `.yaml` files that define a database schema. This parser identifies tables, and columns to allow structured interpretation of database schema files.
### Technical Description
The parser uses the Pest library to define grammar rules that interpret specific `.yaml` structures. It parses:
- Schema name
- Tables within the schema
- Columns their types and modes within each table
The parsed data can be used to generate structured representation of database schemas for your application.
### Example of Schema
```text
Schema should be structured like this
File
└── Schema Section
├── Schema Entry
│ ├── Name: "name"
│ └── Tables
│ └── Table Section
│ ├── Table Entry
│ │ ├── Name: table_name
│ │ └── Columns
│ │ └── Column Section
│ │ ├── Column Entry
│ │ │ ├── Column Name
│ │ │ ├── Type
│ │ │ └── Mode
```
And generally look like this
```yaml
schema:
name: myschema
tables:
user:
columns:
id:
type: int
mode: required
name:
type: str
mode: required
avg_grade:
type: float
mode: nullable
```
This schema could be processed like this.
```rust
file_name => {
let content = fs::read_to_string(file_name);
match content {
Ok(file_content) => match parse_schema(&file_content) {
Ok(schema) => println!("{:#?}", schema),
Err(SchemaErr::ParseError(e)) => {
eprintln!("Error while parsing the file: {}", e)
}
Err(materynskyis_yaml_schema_parser::SchemaErr::MissingValue) => {
eprintln!("Missing value");
}
},
Err(e) => eprintln!("Failed to read file '{}': {}", file_name, e),
}
}
```
And in result we will have this struct:
```rust
Schema {
name: "myschema",
tables: [
Table {
name: "user",
columns: [
Column {
name: "id",
datatype: "int",
mode: "required",
},
Column {
name: "name",
datatype: "str",
mode: "required",
},
Column {
name: "avg_grade",
datatype: "float",
mode: "nullable",
},
],
},
],
}
```