Skip to content

Commit f0b3dfe

Browse files
committed
upgrade to nom v7
1 parent c462683 commit f0b3dfe

File tree

4 files changed

+31
-18
lines changed

4 files changed

+31
-18
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ version = "0.1.36"
2222
default-features = false
2323

2424
[dependencies.nom]
25-
version = "6"
25+
version = "7.0.0"
2626
default-features = false
2727

2828
[dependencies.chrono]

src/common.rs

+24-5
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,15 @@ pub fn take_n_digits(n: usize) -> impl FnMut(&str) -> StrResult<&str> {
9696
pub fn two_digits<T: FromStr>(remain: &str) -> StrResult<T> {
9797
let (remain, two) = take_n_digits(2)(remain)?;
9898
// NonZeroU8's FromStr implementation rejects 00.
99-
let (_, parsed) = nom::parse_to!(two, T)?;
99+
let parsed = two.parse_to_err()?;
100100
Ok((remain, parsed))
101101
}
102102

103103
/// Level 0 month or day. Two digits, and the range is not checked here.
104104
pub fn two_digits_zero_none(remain: &str) -> StrResult<Option<NonZeroU8>> {
105105
let (remain, two) = take_n_digits(2).parse(remain)?;
106106
// NonZeroU8's FromStr implementation rejects 00.
107-
let (_, parsed) = nom::parse_to!(two, u8)?;
107+
let parsed = two.parse_to_err()?;
108108
Ok((remain, NonZeroU8::new(parsed)))
109109
}
110110

@@ -124,10 +124,29 @@ pub enum UnvalidatedTz {
124124
HoursMinutes { positive: bool, hh: u8, mm: u8 },
125125
}
126126

127+
pub(crate) trait ParseToExt<R>: ParseTo<R>
128+
where
129+
R: FromStr,
130+
{
131+
fn parse_to_err(self) -> Result<R, nom::Err<nom::error::Error<Self>>>
132+
where
133+
Self: Sized,
134+
{
135+
self.parse_to().ok_or_else(|| {
136+
nom::Err::Error(NomParseError::from_error_kind(
137+
self,
138+
// whatever. nom should have an Other errorkind.
139+
nom::error::ErrorKind::MapRes,
140+
))
141+
})
142+
}
143+
}
144+
impl<S: ParseTo<R>, R: FromStr> ParseToExt<R> for S {}
145+
127146
pub fn year_n(n: usize) -> impl FnMut(&str) -> StrResult<i32> {
128147
move |remain| {
129148
let (remain, four) = take_n_digits(n)(remain)?;
130-
let (_, parsed) = nom::parse_to!(four, i32)?;
149+
let parsed: i32 = four.parse_to_err()?;
131150
Ok((remain, parsed))
132151
}
133152
}
@@ -136,7 +155,7 @@ pub fn year_n_signed(n: usize) -> impl FnMut(&str) -> StrResult<i32> {
136155
move |remain| {
137156
let (remain, sign) = minus_sign(-1i32, 1)(remain)?;
138157
let (remain, four) = take_n_digits(n)(remain)?;
139-
let (_, parsed) = nom::parse_to!(four, i32)?;
158+
let parsed: i32 = four.parse_to_err()?;
140159
if sign == -1 && parsed == 0 {
141160
return Err(nom::Err::Error(NomParseError::from_error_kind(
142161
remain,
@@ -153,7 +172,7 @@ pub fn signed_year_min_n(n: usize) -> impl FnMut(&str) -> StrResult<i64> {
153172
let nonzero_digit = ncc::satisfy(|c| c.is_ascii_digit() && c != '0');
154173
let (remain, sign) = minus_sign(-1i64, 1i64).parse(remain)?;
155174
let (remain, digs) = nc::recognize(nonzero_digit.and(take_min_n_digits(n - 1)))(remain)?;
156-
let (_, parsed) = nom::parse_to!(digs, i64)?;
175+
let parsed: i64 = digs.parse_to_err()?;
157176
Ok((remain, parsed * sign))
158177
}
159178
}

src/level0/parser.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
//
55
// Copyright © 2021 Corporation for Digital Scholarship
66

7-
use crate::helpers::ParserExt;
87
use crate::ParseError;
8+
use crate::{common::ParseToExt, helpers::ParserExt};
99

1010
#[allow(unused_imports)]
1111
use nom::{
@@ -78,7 +78,7 @@ pub(crate) fn date(remain: &str) -> StrResult<Date> {
7878
/// Level 0 year only, so simply exactly four digits 0-9. That's it.
7979
fn year4(remain: &str) -> StrResult<i32> {
8080
let (remain, four) = take_n_digits(4)(remain)?;
81-
let (_, parsed) = nom::parse_to!(four, i32)?;
81+
let parsed = four.parse_to_err()?;
8282
Ok((remain, parsed))
8383
}
8484

src/level2/parser.rs

+4-10
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use nom::{
1212
};
1313

1414
use crate::{
15-
common::{signed_year_min_n, year_n_signed, StrResult},
15+
common::{signed_year_min_n, year_n_signed, ParseToExt, StrResult},
1616
helpers::ParserExt,
1717
ParseError,
1818
};
@@ -80,14 +80,8 @@ fn scientific_y(remain: &str) -> StrResult<ScientificYear> {
8080
.or(ns::preceded(ncc::char('Y'), signed_year_min_n(5)).map(|y| (y, None)))
8181
.and(ns::preceded(s, ncc::digit1).optional())
8282
.parse(remain)?;
83-
let exponent = opt_e
84-
.map(|e| nom::parse_to!(e, u16))
85-
.transpose()?
86-
.map(|x| x.1);
87-
let sig_digits = opt_s
88-
.map(|s| nom::parse_to!(s, u16))
89-
.transpose()?
90-
.map(|x| x.1);
83+
let exponent = opt_e.map(ParseToExt::<u16>::parse_to_err).transpose()?;
84+
let sig_digits = opt_s.map(ParseToExt::<u16>::parse_to_err).transpose()?;
9185
Ok((
9286
remain,
9387
ScientificYear {
@@ -103,7 +97,7 @@ fn scientific_4digit(remain: &str) -> StrResult<ScientificYear> {
10397
let (remain, (year, sd)) = year_n_signed(4)
10498
.and(ns::preceded(s, ncc::digit1))
10599
.parse(remain)?;
106-
let (_, sd) = nom::parse_to!(sd, u16)?;
100+
let sd: u16 = sd.parse_to_err()?;
107101
Ok((
108102
remain,
109103
ScientificYear {

0 commit comments

Comments
 (0)