Skip to main content

oak_csv/parser/
parse.rs

1use crate::{
2    language::CsvLanguage,
3    lexer::CsvTokenType,
4    parser::{CsvElementType, CsvParser, State},
5};
6use oak_core::{GreenNode, OakError};
7
8impl<'config> CsvParser<'config> {
9    pub(crate) fn parse_root_internal<'a, S: oak_core::Source + ?Sized>(&self, state: &mut State<'a, S>) -> Result<&'a GreenNode<'a, CsvLanguage>, OakError> {
10        use crate::{lexer::CsvTokenType::*, parser::CsvElementType::*};
11        let cp = state.checkpoint();
12
13        while state.not_at_end() && !state.at(Eof) {
14            self.parse_record(state)?;
15            if state.at(Newline) {
16                state.bump();
17            }
18        }
19
20        Ok(state.finish_at(cp, SourceFile))
21    }
22
23    fn parse_record<'a, S: oak_core::Source + ?Sized>(&self, state: &mut State<'a, S>) -> Result<(), OakError> {
24        use crate::{lexer::CsvTokenType::*, parser::CsvElementType::*};
25        let cp = state.checkpoint();
26
27        self.parse_field(state)?;
28        while state.at(Comma) {
29            state.bump();
30            self.parse_field(state)?;
31        }
32
33        state.finish_at(cp, Record);
34        Ok(())
35    }
36
37    fn parse_field<'a, S: oak_core::Source + ?Sized>(&self, state: &mut State<'a, S>) -> Result<(), OakError> {
38        let cp = state.checkpoint();
39        if state.at(CsvTokenType::Field) {
40            state.bump();
41        }
42        else {
43            // Empty field
44        }
45        state.finish_at(cp, CsvElementType::Field);
46        Ok(())
47    }
48}