diff --git a/src/lib.rs b/src/lib.rs index ecbeb23..59ee84d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ use nom::{ branch::alt, bytes::complete::{tag, take_till1}, combinator::value, + multi::separated_list0, sequence::delimited, }; use std::collections::HashMap; @@ -63,9 +64,19 @@ fn parse_escape_character(input: &str) -> IResult<&str, char> { .parse(input) } +fn parse_array(input: &str) -> IResult<&str, JsonValue> { + delimited( + tag("["), + separated_list0(tag(","), deserialize_json), + tag("]"), + ) + .map(JsonValue::Array) + .parse(input) +} + pub fn deserialize_json(json: &str) -> IResult<&str, JsonValue> { // map_res(); - alt((parse_null, parse_bool, parse_string)).parse(json) + alt((parse_null, parse_bool, parse_string, parse_array)).parse(json) } #[cfg(test)] @@ -103,6 +114,43 @@ mod tests { deserialize_json(r#"" \g ""#).expect_err("should be an error"); } + #[test] + fn deserializes_simple_arrays() { + let t = deserialize_json("[]").unwrap(); + assert_eq!(t.1, JsonValue::Array(vec![])); + let f = deserialize_json("[true]").unwrap(); + assert_eq!(f.1, JsonValue::Array(vec![JsonValue::Boolean(true)])); + } + + #[test] + fn deserializes_arrays() { + let f = deserialize_json("[true,false]").unwrap(); + assert_eq!( + f.1, + JsonValue::Array(vec![JsonValue::Boolean(true), JsonValue::Boolean(false)]) + ); + } + #[test] + fn deserializes_nested_arrays() { + let f = deserialize_json("[[true,false],[\"string!\"],[[[null],[],[]]]]").unwrap(); + let empty_array = JsonValue::Array(vec![]); + let boolean_array = + JsonValue::Array(vec![JsonValue::Boolean(true), JsonValue::Boolean(false)]); + let three_arrays = JsonValue::Array(vec![ + JsonValue::Array(vec![JsonValue::Null]), + empty_array.clone(), + empty_array.clone(), + ]); + assert_eq!( + f.1, + JsonValue::Array(vec![ + boolean_array, + JsonValue::Array(vec![JsonValue::String("string!".to_string())]), + JsonValue::Array(vec![three_arrays]) + ]) + ); + } + #[test] #[ignore] fn deserializes_real_json() {