From 92155a8f3614875e4a4f9cfb97e70b299d838de2 Mon Sep 17 00:00:00 2001 From: Greg Shuflin Date: Fri, 21 Oct 2022 17:04:16 -0700 Subject: [PATCH] Work around infinite recursion with closure --- src/lib.rs | 56 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index ab750fe..149abf4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -101,12 +101,15 @@ mod tests { } fn json_array() -> impl JsonParser<'static, JsonValue> { - let val = json_value().delimited(whitespace(), whitespace()); + move |input| { + let val = json_value().delimited(whitespace(), whitespace()); - repeated(val) - .separated_by(literal(","), false) - .delimited(literal_char('['), literal_char(']')) - .map(JsonValue::Array) + repeated(val) + .separated_by(literal(","), false) + .delimited(literal_char('['), literal_char(']')) + .map(JsonValue::Array) + .parse(input) + } } fn json_value() -> impl JsonParser<'static, JsonValue> { @@ -147,20 +150,33 @@ mod tests { #[test] fn parse_json_array() { assert!(json_array().parse(r#"[ 4, 9, "ara",]"#).is_err()); - // assert_eq!( - // json_array().parse(r#"[ 4, 9, "foo" ]"#).unwrap(), - // ( - // JsonValue::Array(vec![ - // JsonValue::Num(4.), - // JsonValue::Num(9.0), - // JsonValue::Str("foo".to_string()) - // ]), - // "" - // ) - // ); - // assert_eq!(json_array().parse(r#"[8,null,[],5]"#).unwrap(), (JsonValue::Array(vec![ - // JsonValue::Num(8.), JsonValue::Null, JsonValue::Array(vec![]), JsonValue::Num(5.) - // ]), "")); - // assert_eq!(json_value().parse("true"), Ok((JsonValue::Bool(true), ""))); + assert_eq!( + json_array().parse("[[],[]]").unwrap().0, + JsonValue::Array(vec![JsonValue::Array(vec![]), JsonValue::Array(vec![])]) + ); + assert_eq!( + json_array().parse(r#"[ 4, 9, "foo" ]"#).unwrap(), + ( + JsonValue::Array(vec![ + JsonValue::Num(4.), + JsonValue::Num(9.0), + JsonValue::Str("foo".to_string()) + ]), + "" + ) + ); + assert_eq!( + json_array().parse(r#"[8,null,[],5]"#).unwrap(), + ( + JsonValue::Array(vec![ + JsonValue::Num(8.), + JsonValue::Null, + JsonValue::Array(vec![]), + JsonValue::Num(5.) + ]), + "" + ) + ); + assert_eq!(json_value().parse("true"), Ok((JsonValue::Bool(true), ""))); } }