table_extractor/parser/
mysql.rs1use 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 if trimmed.is_empty() || trimmed.starts_with('+') {
22 continue;
23 }
24
25 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 let trimmed = line.trim().trim_start_matches('|').trim_end_matches('|');
44
45 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}