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 }
45 state.finish_at(cp, CsvElementType::Field);
46 Ok(())
47 }
48}