csv_parser_moshkovskyi/
lib.rs1use 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}