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}