table_extractor/parser/
mysql.rs

1use crate::error::Result;
2use crate::{Parser, Table};
3
4pub struct MySqlParser;
5
6impl Parser for MySqlParser {
7    fn parse(&self, input: &str) -> Result<Table> {
8        let lines: Vec<&str> = input.lines().collect();
9
10        if lines.is_empty() {
11            return Ok(Table::new(vec![], vec![]));
12        }
13
14        let mut headers = Vec::new();
15        let mut rows = Vec::new();
16
17        for line in lines {
18            let trimmed = line.trim();
19
20            // Skip empty lines and border lines (starting with +)
21            if trimmed.is_empty() || trimmed.starts_with('+') {
22                continue;
23            }
24
25            // Parse data lines (starting and ending with |)
26            if trimmed.starts_with('|') && trimmed.ends_with('|') {
27                let cells = parse_mysql_row(trimmed);
28
29                if headers.is_empty() {
30                    headers = cells;
31                } else {
32                    rows.push(cells);
33                }
34            }
35        }
36
37        Table::new_validated(headers, rows)
38    }
39}
40
41fn parse_mysql_row(line: &str) -> Vec<String> {
42    // Remove leading and trailing pipes
43    let trimmed = line.trim().trim_start_matches('|').trim_end_matches('|');
44
45    // Split by | and trim each cell
46    trimmed
47        .split('|')
48        .map(|cell| cell.trim().to_string())
49        .collect()
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn test_parse_mysql() {
58        let input = r#"+----+----------------------------+
59| id | name                       |
60+----+----------------------------+
61|  1 | Preston Carlton's Company  |
62|  2 | Fawzia Masud's Company     |
63+----+----------------------------+"#;
64
65        let parser = MySqlParser;
66        let table = parser.parse(input).unwrap();
67
68        assert_eq!(table.headers, vec!["id", "name"]);
69        assert_eq!(table.rows.len(), 2);
70        assert_eq!(table.rows[0], vec!["1", "Preston Carlton's Company"]);
71        assert_eq!(table.rows[1], vec!["2", "Fawzia Masud's Company"]);
72    }
73}