From 8439ef0cd59ecf20fba9426d41a272707172cd30 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 21 Apr 2025 19:07:46 +0200 Subject: [PATCH] Update nom to new major version --- CHANGELOG.md | 4 ++++ Cargo.toml | 6 ++--- src/parser.rs | 63 +++++++++++++++++++++++++++++---------------------- 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd2bf82..0669846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ## [Unreleased] - ReleaseDate +### Changed + +- update [nom](https://crates.io/crates/nom) to v8 + ## [1.2.0] - 2024-03-21 ### Added diff --git a/Cargo.toml b/Cargo.toml index d1551a7..0868559 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,12 +16,12 @@ exclude = [ ] [dependencies] -nom = "7" -nom_locate = "4.1" +nom = "8" +nom_locate = "5" serde = { version = "1.0", default-features = false } [dev-dependencies] -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0", features = ["derive"] } [badges] maintenance = { status = "passively-maintained" } diff --git a/src/parser.rs b/src/parser.rs index 573d1ce..b471e31 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4,8 +4,8 @@ use nom::character::complete::{char, digit1, none_of, not_line_ending, one_of}; use nom::combinator::{cut, eof, map, map_res, opt, recognize, value}; use nom::multi::many1_count; use nom::number::complete::double; -use nom::sequence::{delimited, preceded, terminated, tuple}; -use nom::{IResult, Slice}; +use nom::sequence::{delimited, preceded, terminated}; +use nom::{IResult, Input as _, Parser as _}; use nom_locate::LocatedSpan; pub(crate) type Span<'a> = LocatedSpan<&'a str>; @@ -35,23 +35,25 @@ fn whitespace(input: Span) -> IResult { } fn null(input: Span) -> IResult { - value((), tag("null"))(input) + value((), tag("null")).parse(input) } fn separator(input: Span) -> IResult { map(alt((tag(","), tag("\n"), tag("\r\n"))), |val: Span| { *val.fragment() - })(input) + }) + .parse(input) } fn bool(input: Span) -> IResult { - alt((value(true, tag("true")), value(false, tag("false"))))(input) + alt((value(true, tag("true")), value(false, tag("false")))).parse(input) } fn integer(input: Span) -> IResult { - map_res(recognize(tuple((opt(char('-')), digit1))), |val: Span| { + map_res(recognize((opt(char('-')), digit1)), |val: Span| { val.fragment().parse::() - })(input) + }) + .parse(input) } fn float(input: Span) -> IResult { @@ -61,14 +63,16 @@ fn float(input: Span) -> IResult { fn identifier(input: Span) -> IResult { map(recognize(many1_count(none_of("\" \t\n=:"))), |val: Span| { *val.fragment() - })(input) + }) + .parse(input) } fn literal_string(input: Span) -> IResult { map( delimited(tag("\"\"\""), take_until("\"\"\""), tag("\"\"\"")), |val: Span| *val.fragment(), - )(input) + ) + .parse(input) } fn string_content(input: Span) -> IResult { @@ -84,49 +88,51 @@ fn string_content(input: Span) -> IResult { } '\n' if !escaped => { let err = nom::error::Error { - input: input.slice(j..), + input: input.take_from(j), code: nom::error::ErrorKind::Char, }; return Err(nom::Err::Error(err)); } '"' if !escaped => { - return Ok((input.slice(j..), &buf[0..j])); + return Ok((input.take_from(j), &buf[0..j])); } _ => escaped = false, } } let err = nom::error::Error { - input: input.slice((i + 1)..), + input: input.take_from(i + 1), code: nom::error::ErrorKind::Char, }; Err(nom::Err::Failure(err)) } fn delimited_string(input: Span) -> IResult { - preceded(char('"'), cut(terminated(string_content, char('"'))))(input) + preceded(char('"'), cut(terminated(string_content, char('"')))).parse(input) } fn string(input: Span) -> IResult { - alt((identifier, literal_string, delimited_string))(input) + alt((identifier, literal_string, delimited_string)).parse(input) } fn line_comment(input: Span) -> IResult { map( preceded(tag("//"), alt((not_line_ending, eof))), |val: Span| *val.fragment(), - )(input) + ) + .parse(input) } fn block_comment(input: Span) -> IResult { map( delimited(tag("/*"), take_until("*/"), tag("*/")), |val: Span| *val.fragment(), - )(input) + ) + .parse(input) } fn comment(input: Span) -> IResult { - alt((line_comment, block_comment))(input) + alt((line_comment, block_comment)).parse(input) } fn optional(input: Span) -> IResult { @@ -135,7 +141,7 @@ fn optional(input: Span) -> IResult { let empty = value((), tag("")); let content = value((), many1_count(alt((whitespace, comment)))); - alt((content, empty))(input) + alt((content, empty)).parse(input) } pub(crate) fn parse_next_token(input: Span) -> IResult { @@ -159,45 +165,48 @@ pub(crate) fn parse_next_token(input: Span) -> IResult { map(float, Token::Float), map(string, |val| Token::String(val.to_string())), )), - )(input) + ) + .parse(input) } pub(crate) fn parse_trailing_characters(input: Span) -> IResult { - value((), optional)(input) + value((), optional).parse(input) } pub(crate) fn parse_null(input: Span) -> IResult { - preceded(optional, value(Token::Null, null))(input) + preceded(optional, value(Token::Null, null)).parse(input) } pub(crate) fn parse_separator(input: Span) -> IResult { preceded( opt(horizontal_whitespace), value(Token::Separator, separator), - )(input) + ) + .parse(input) } pub(crate) fn parse_bool(input: Span) -> IResult { - preceded(optional, map(bool, Token::Boolean))(input) + preceded(optional, map(bool, Token::Boolean)).parse(input) } pub(crate) fn parse_integer(input: Span) -> IResult { - preceded(optional, map(integer, Token::Integer))(input) + preceded(optional, map(integer, Token::Integer)).parse(input) } pub(crate) fn parse_float(input: Span) -> IResult { - preceded(optional, map(float, Token::Float))(input) + preceded(optional, map(float, Token::Float)).parse(input) } pub(crate) fn parse_identifier(input: Span) -> IResult { preceded( optional, map(identifier, |val| Token::String(val.to_string())), - )(input) + ) + .parse(input) } pub(crate) fn parse_string(input: Span) -> IResult { - preceded(optional, map(string, |val| Token::String(val.to_string())))(input) + preceded(optional, map(string, |val| Token::String(val.to_string()))).parse(input) } #[cfg(test)]