csv_parser_moshkovskyi/
lib.rs

1use pest::iterators::Pair;
2use pest::Parser;
3use pest_derive::Parser;
4use thiserror::Error;
5#[derive(Parser)]
6#[grammar = "gramatyka.pest"]
7pub struct Grammar;
8
9#[derive(Error, Debug)]
10
11pub enum CsvParseError {
12    #[error("ERror")]
13    InvalidCsvStructure,
14
15    #[error("Pest parsing error: {0}")]
16    PestError(#[from] pest::error::Error<Rule>),
17}
18
19pub fn parse_csv(file_content: &str) -> Result<(), CsvParseError> {
20    let parsed = Grammar::parse(Rule::csv, file_content).map_err(|e| {
21        println!("Parsing error: {:?}", e);
22        CsvParseError::PestError(e)
23    })?;
24
25    println!("{}", file_content);
26
27    for csv_pair in parsed {
28        for record in csv_pair.into_inner() {
29            println!("{:?}", record);
30            match record.as_rule() {
31                Rule::record => {
32                    let fields: Vec<&str> = record
33                        .into_inner()
34                        .map(|field| field.as_str().trim_matches('"'))
35                        .collect();
36                    println!("Record: {:?}", fields);
37                }
38                _ => return Err(CsvParseError::InvalidCsvStructure),
39            }
40        }
41    }
42
43    Ok(())
44}