diff --git a/src/lib.rs b/src/lib.rs index 8f0d80f..1035aa9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,13 @@ use nom::{ - IResult, Parser, branch::alt, bytes::complete::tag, combinator::map_res, sequence::delimited, + IResult, Parser, + branch::alt, + bytes::complete::tag, + combinator::{map_res, value}, + sequence::delimited, }; use std::collections::HashMap; -#[derive(PartialEq, Debug)] +#[derive(PartialEq, Debug, Clone)] pub enum JsonValue { Object(HashMap), Array(Vec), @@ -15,16 +19,12 @@ pub enum JsonValue { } fn parse_null(input: &str) -> IResult<&str, JsonValue> { - let remaining = tag("null")(input)?.1; - Ok((remaining, JsonValue::Null)) + value(JsonValue::Null, tag("null")).parse(input) } fn parse_bool(input: &str) -> IResult<&str, JsonValue> { - let parsed = map_res(alt((tag("true"), tag("false"))), |st: &str| { - st.parse::() - }) - .parse(input)?; - - Ok((parsed.0, JsonValue::Boolean(parsed.1))) + alt((value(true, tag("true")), value(false, tag("false")))) + .map(JsonValue::Boolean) + .parse(input) } fn parse_string(input: &str) -> IResult<&str, JsonValue> { delimited(tag("\""), parse_string_inner, tag("\"")).parse(input)