use crate::Result;
use crate::error::Error;
use crate::parser::HoconParser;
use crate::parser::read::Read;
use crate::raw::raw_array::RawArray;
impl<'de, R: Read<'de>> HoconParser<R> {
pub(crate) fn parse_array(&mut self, verify_delimiter: bool) -> Result<RawArray> {
if verify_delimiter {
let ch = self.reader.peek()?;
if ch != b'[' {
return Err(Error::UnexpectedToken {
expected: "[",
found_beginning: ch,
});
}
}
self.reader.discard(1)?;
let mut values = vec![];
loop {
self.drop_whitespace_and_comments()?;
let ch = self.reader.peek()?;
if ch == b']' {
self.reader.discard(1)?;
break;
}
let v = self.parse_value()?;
values.push(v);
self.drop_whitespace_and_comments()?;
if self.drop_comma_separator()? {
break;
}
}
Ok(RawArray::new(values))
}
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use crate::Result;
use crate::parser::HoconParser;
use crate::parser::read::StreamRead;
use crate::raw::raw_value::RawValue;
#[rstest]
#[case("[1,2,3]", vec![RawValue::number(1), RawValue::number(2), RawValue::number(3)])]
#[case("[true,false,null]", vec![RawValue::Boolean(true), RawValue::Boolean(false), RawValue::Null])]
#[case("[1,2 ,3,\n]", vec![RawValue::number(1), RawValue::number(2), RawValue::number(3)])]
#[case("[1\r\n2 ,3, \n]", vec![RawValue::number(1), RawValue::number(2), RawValue::number(3)])]
#[case("[1\r\n2.0001 ,3, \n]", vec![RawValue::number(1), RawValue::number(serde_json::Number::from_f64(2.0001).unwrap()), RawValue::number(3)])]
#[case("[1\r\n2.0001f ,3, \n]", vec![RawValue::number(1), RawValue::unquoted_string("2.0001f"), RawValue::number(3)])]
fn test_valid_array(#[case] input: &str, #[case] expected: Vec<RawValue>) -> Result<()> {
use std::io::BufReader;
let read = StreamRead::new(BufReader::new(input.as_bytes()));
let mut parser = HoconParser::new(read);
let values = parser.parse_array(true)?.into_inner();
assert_eq!(values, expected);
Ok(())
}
}