ryson/
array.rs

1use std::{mem, usize, vec};
2
3use crate::common::{Json,Jerr,IteratorParser,StrIt};
4
5#[derive(Debug,PartialEq,Eq)]
6enum ArrayParserState {
7    Beginning,
8    Comma,
9    Value
10}
11pub struct JArrayParser {
12    vector:Vec<Json>,
13    state:ArrayParserState
14}
15
16impl JArrayParser {
17    pub fn new()->JArrayParser {
18        JArrayParser{
19            vector:vec![],
20            state:ArrayParserState::Beginning
21        }
22    }
23    fn reset(&mut self){
24        *self = JArrayParser::new();
25    }
26    fn push_comma(&mut self,iter:&mut StrIt,i:usize)->Result<(),Jerr>{
27        if self.state == ArrayParserState::Comma {
28            iter.next();
29            self.state = ArrayParserState::Value;
30            Ok(())
31        }
32        else{
33            Err(Jerr::ExpectedValue(i))
34        }
35    }
36    fn push_bracket(&mut self,iter:&mut StrIt,i:usize)->Result<Json,Jerr>{
37        if self.state == ArrayParserState::Comma || self.state == ArrayParserState::Beginning {
38            iter.next();
39            let vec = mem::replace(&mut self.vector, vec![]);
40            self.reset();
41            return Ok(Json::Array(vec));
42        }
43        else{
44            return Err(Jerr::ExpectedValue(i));
45        }
46    }
47    fn push_value(&mut self,iter:&mut StrIt,iterparser:&impl IteratorParser,i:usize)->Result<(),Jerr>{
48        if self.state == ArrayParserState::Value || self.state == ArrayParserState::Beginning {
49            self.vector.push(iterparser.parse(iter)?);
50            self.state = ArrayParserState::Comma;
51            Ok(())
52        }
53        else{
54            return Err(Jerr::ExpectedCommaOrEnd(i));
55        }
56    }
57    fn push_space(&mut self,iter:&mut StrIt){
58        iter.next();
59    }
60    pub fn parse(&mut self,iter:&mut StrIt,iterparser:&impl IteratorParser)->Result<Json,Jerr>{
61        iter.next().unwrap();
62        loop {
63            match iter.peek().cloned() {
64                None=>{
65                    return Err(Jerr::UnexpectedEnd);
66                },
67                Some((i,c))=>match c {
68                    ',' => self.push_comma(iter,i)?,
69                    ']' => return self.push_bracket(iter,i),
70                    ' ' | '\n' | '\t'=>self.push_space(iter),
71                    _=> self.push_value(iter,iterparser, i)?
72                }
73            }
74        }
75    }
76}