Skip to content

Commit 3405b37

Browse files
committed
Resolve Winnow deprecations
1 parent 783c4e6 commit 3405b37

File tree

16 files changed

+99
-100
lines changed

16 files changed

+99
-100
lines changed

gix-actor/src/signature/decode.rs

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pub(crate) mod function {
33
use bstr::ByteSlice;
44
use gix_date::{time::Sign, OffsetInSeconds, SecondsSinceUnixEpoch, Time};
55
use gix_utils::btoi::to_signed;
6-
use winnow::error::{ErrMode, ErrorKind};
6+
use winnow::error::ErrMode;
77
use winnow::stream::Stream;
88
use winnow::{
99
combinator::{alt, opt, separated_pair, terminated},
@@ -18,7 +18,7 @@ pub(crate) mod function {
1818
/// Parse a signature from the bytes input `i` using `nom`.
1919
pub fn decode<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>(
2020
i: &mut &'a [u8],
21-
) -> PResult<SignatureRef<'a>, E> {
21+
) -> ModalResult<SignatureRef<'a>, E> {
2222
separated_pair(
2323
identity,
2424
opt(b" "),
@@ -68,31 +68,29 @@ pub(crate) mod function {
6868
/// Parse an identity from the bytes input `i` (like `name <email>`) using `nom`.
6969
pub fn identity<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>(
7070
i: &mut &'a [u8],
71-
) -> PResult<IdentityRef<'a>, E> {
71+
) -> ModalResult<IdentityRef<'a>, E> {
7272
let start = i.checkpoint();
7373
let eol_idx = i.find_byte(b'\n').unwrap_or(i.len());
74-
let right_delim_idx =
75-
i[..eol_idx]
76-
.rfind_byte(b'>')
77-
.ok_or(ErrMode::Cut(E::from_error_kind(i, ErrorKind::Eof).add_context(
78-
i,
79-
&start,
80-
StrContext::Label("Closing '>' not found"),
81-
)))?;
74+
let right_delim_idx = i[..eol_idx]
75+
.rfind_byte(b'>')
76+
.ok_or(ErrMode::Cut(E::from_input(i).add_context(
77+
i,
78+
&start,
79+
StrContext::Label("Closing '>' not found"),
80+
)))?;
8281
let i_name_and_email = &i[..right_delim_idx];
8382
let skip_from_right = i_name_and_email
8483
.iter()
8584
.rev()
8685
.take_while(|b| b.is_ascii_whitespace() || **b == b'>')
8786
.count();
88-
let left_delim_idx =
89-
i_name_and_email
90-
.find_byte(b'<')
91-
.ok_or(ErrMode::Cut(E::from_error_kind(i, ErrorKind::Eof).add_context(
92-
&i_name_and_email,
93-
&start,
94-
StrContext::Label("Opening '<' not found"),
95-
)))?;
87+
let left_delim_idx = i_name_and_email
88+
.find_byte(b'<')
89+
.ok_or(ErrMode::Cut(E::from_input(i).add_context(
90+
&i_name_and_email,
91+
&start,
92+
StrContext::Label("Opening '<' not found"),
93+
)))?;
9694
let skip_from_left = i[left_delim_idx..]
9795
.iter()
9896
.take_while(|b| b.is_ascii_whitespace() || **b == b'<')
@@ -102,7 +100,7 @@ pub(crate) mod function {
102100

103101
let email = i
104102
.get(left_delim_idx + skip_from_left..right_delim_idx - skip_from_right)
105-
.ok_or(ErrMode::Cut(E::from_error_kind(i, ErrorKind::Eof).add_context(
103+
.ok_or(ErrMode::Cut(E::from_input(i).add_context(
106104
&i_name_and_email,
107105
&start,
108106
StrContext::Label("Skipped parts run into each other"),
@@ -126,7 +124,7 @@ mod tests {
126124

127125
fn decode<'i>(
128126
i: &mut &'i [u8],
129-
) -> PResult<SignatureRef<'i>, winnow::error::TreeError<&'i [u8], winnow::error::StrContext>> {
127+
) -> ModalResult<SignatureRef<'i>, winnow::error::TreeError<&'i [u8], winnow::error::StrContext>> {
130128
signature::decode.parse_next(i)
131129
}
132130

gix-config/src/parse/nom/mod.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::borrow::Cow;
33
use bstr::{BStr, ByteSlice};
44
use winnow::{
55
combinator::{alt, delimited, opt, preceded, repeat},
6-
error::{ErrorKind, InputError as NomError, ParserError as _},
6+
error::{InputError as NomError, ParserError as _},
77
prelude::*,
88
stream::{Offset as _, Stream as _},
99
token::{one_of, take_till, take_while},
@@ -78,7 +78,7 @@ fn newlines_from(input: &[u8], start: winnow::stream::Checkpoint<&[u8], &[u8]>)
7878
start_input.next_slice(offset).iter().filter(|c| **c == b'\n').count()
7979
}
8080

81-
fn comment<'i>(i: &mut &'i [u8]) -> PResult<Comment<'i>, NomError<&'i [u8]>> {
81+
fn comment<'i>(i: &mut &'i [u8]) -> ModalResult<Comment<'i>, NomError<&'i [u8]>> {
8282
(
8383
one_of([';', '#']),
8484
take_till(0.., |c| c == b'\n').map(|text: &[u8]| Cow::Borrowed(text.as_bstr())),
@@ -94,7 +94,7 @@ fn section<'i>(
9494
i: &mut &'i [u8],
9595
node: &mut ParseNode,
9696
dispatch: &mut dyn FnMut(Event<'i>),
97-
) -> PResult<(), NomError<&'i [u8]>> {
97+
) -> ModalResult<(), NomError<&'i [u8]>> {
9898
let start = i.checkpoint();
9999
let header = section_header(i).map_err(|e| {
100100
i.reset(&start);
@@ -129,7 +129,7 @@ fn section<'i>(
129129
Ok(())
130130
}
131131

132-
fn section_header<'i>(i: &mut &'i [u8]) -> PResult<section::Header<'i>, NomError<&'i [u8]>> {
132+
fn section_header<'i>(i: &mut &'i [u8]) -> ModalResult<section::Header<'i>, NomError<&'i [u8]>> {
133133
// No spaces must be between section name and section start
134134
let name = preceded('[', take_while(1.., is_section_char).map(bstr::ByteSlice::as_bstr)).parse_next(i)?;
135135

@@ -150,7 +150,7 @@ fn section_header<'i>(i: &mut &'i [u8]) -> PResult<section::Header<'i>, NomError
150150
};
151151

152152
if header.name.is_empty() {
153-
return Err(winnow::error::ErrMode::from_error_kind(i, ErrorKind::Fail));
153+
return Err(winnow::error::ErrMode::from_input(i));
154154
}
155155
return Ok(header);
156156
}
@@ -169,7 +169,7 @@ fn is_section_char(c: u8) -> bool {
169169
c.is_ascii_alphanumeric() || c == b'-' || c == b'.'
170170
}
171171

172-
fn sub_section<'i>(i: &mut &'i [u8]) -> PResult<Cow<'i, BStr>, NomError<&'i [u8]>> {
172+
fn sub_section<'i>(i: &mut &'i [u8]) -> ModalResult<Cow<'i, BStr>, NomError<&'i [u8]>> {
173173
let mut output = Cow::Borrowed(Default::default());
174174
if let Some(sub) = opt(subsection_subset).parse_next(i)? {
175175
output = Cow::Borrowed(sub.as_bstr());
@@ -181,15 +181,15 @@ fn sub_section<'i>(i: &mut &'i [u8]) -> PResult<Cow<'i, BStr>, NomError<&'i [u8]
181181
Ok(output)
182182
}
183183

184-
fn subsection_subset<'i>(i: &mut &'i [u8]) -> PResult<&'i [u8], NomError<&'i [u8]>> {
184+
fn subsection_subset<'i>(i: &mut &'i [u8]) -> ModalResult<&'i [u8], NomError<&'i [u8]>> {
185185
alt((subsection_unescaped, subsection_escaped_char)).parse_next(i)
186186
}
187187

188-
fn subsection_unescaped<'i>(i: &mut &'i [u8]) -> PResult<&'i [u8], NomError<&'i [u8]>> {
188+
fn subsection_unescaped<'i>(i: &mut &'i [u8]) -> ModalResult<&'i [u8], NomError<&'i [u8]>> {
189189
take_while(1.., is_subsection_unescaped_char).parse_next(i)
190190
}
191191

192-
fn subsection_escaped_char<'i>(i: &mut &'i [u8]) -> PResult<&'i [u8], NomError<&'i [u8]>> {
192+
fn subsection_escaped_char<'i>(i: &mut &'i [u8]) -> ModalResult<&'i [u8], NomError<&'i [u8]>> {
193193
preceded('\\', one_of(is_subsection_escapable_char).take()).parse_next(i)
194194
}
195195

@@ -205,7 +205,7 @@ fn key_value_pair<'i>(
205205
i: &mut &'i [u8],
206206
node: &mut ParseNode,
207207
dispatch: &mut dyn FnMut(Event<'i>),
208-
) -> PResult<(), NomError<&'i [u8]>> {
208+
) -> ModalResult<(), NomError<&'i [u8]>> {
209209
*node = ParseNode::Name;
210210
if let Some(name) = opt(config_name).parse_next(i)? {
211211
dispatch(Event::SectionValueName(section::ValueName(Cow::Borrowed(name))));
@@ -223,7 +223,7 @@ fn key_value_pair<'i>(
223223

224224
/// Parses the config name of a config pair. Assumes the input has already been
225225
/// trimmed of any leading whitespace.
226-
fn config_name<'i>(i: &mut &'i [u8]) -> PResult<&'i BStr, NomError<&'i [u8]>> {
226+
fn config_name<'i>(i: &mut &'i [u8]) -> ModalResult<&'i BStr, NomError<&'i [u8]>> {
227227
(
228228
one_of(|c: u8| c.is_ascii_alphabetic()),
229229
take_while(0.., |c: u8| c.is_ascii_alphanumeric() || c == b'-'),
@@ -233,7 +233,7 @@ fn config_name<'i>(i: &mut &'i [u8]) -> PResult<&'i BStr, NomError<&'i [u8]>> {
233233
.parse_next(i)
234234
}
235235

236-
fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PResult<(), NomError<&'i [u8]>> {
236+
fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ModalResult<(), NomError<&'i [u8]>> {
237237
if opt('=').parse_next(i)?.is_some() {
238238
dispatch(Event::KeyValueSeparator);
239239
if let Some(whitespace) = opt(take_spaces1).parse_next(i)? {
@@ -251,7 +251,7 @@ fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PR
251251

252252
/// Handles parsing of known-to-be values. This function handles both single
253253
/// line values as well as values that are continuations.
254-
fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PResult<(), NomError<&'i [u8]>> {
254+
fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> ModalResult<(), NomError<&'i [u8]>> {
255255
let start_checkpoint = i.checkpoint();
256256
let mut value_start_checkpoint = i.checkpoint();
257257
let mut value_end = None;
@@ -278,17 +278,17 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
278278
let escape_index = escaped_index - 1;
279279
let Some(mut c) = i.next_token() else {
280280
i.reset(&start_checkpoint);
281-
return Err(winnow::error::ErrMode::from_error_kind(i, ErrorKind::Token));
281+
return Err(winnow::error::ErrMode::from_input(i));
282282
};
283283
let mut consumed = 1;
284284
if c == b'\r' {
285285
c = i.next_token().ok_or_else(|| {
286286
i.reset(&start_checkpoint);
287-
winnow::error::ErrMode::from_error_kind(i, ErrorKind::Token)
287+
winnow::error::ErrMode::from_input(i)
288288
})?;
289289
if c != b'\n' {
290290
i.reset(&start_checkpoint);
291-
return Err(winnow::error::ErrMode::from_error_kind(i, ErrorKind::Slice));
291+
return Err(winnow::error::ErrMode::from_input(i));
292292
}
293293
consumed += 1;
294294
}
@@ -313,7 +313,7 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
313313
b'n' | b't' | b'\\' | b'b' | b'"' => {}
314314
_ => {
315315
i.reset(&start_checkpoint);
316-
return Err(winnow::error::ErrMode::from_error_kind(i, ErrorKind::Token));
316+
return Err(winnow::error::ErrMode::from_input(i));
317317
}
318318
}
319319
}
@@ -326,7 +326,7 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
326326
}
327327
if is_in_quotes {
328328
i.reset(&start_checkpoint);
329-
return Err(winnow::error::ErrMode::from_error_kind(i, ErrorKind::Slice));
329+
return Err(winnow::error::ErrMode::from_input(i));
330330
}
331331

332332
let value_end = match value_end {
@@ -360,13 +360,13 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
360360
Ok(())
361361
}
362362

363-
fn take_spaces1<'i>(i: &mut &'i [u8]) -> PResult<&'i BStr, NomError<&'i [u8]>> {
363+
fn take_spaces1<'i>(i: &mut &'i [u8]) -> ModalResult<&'i BStr, NomError<&'i [u8]>> {
364364
take_while(1.., winnow::stream::AsChar::is_space)
365365
.map(bstr::ByteSlice::as_bstr)
366366
.parse_next(i)
367367
}
368368

369-
fn take_newlines1<'i>(i: &mut &'i [u8]) -> PResult<&'i BStr, NomError<&'i [u8]>> {
369+
fn take_newlines1<'i>(i: &mut &'i [u8]) -> ModalResult<&'i BStr, NomError<&'i [u8]>> {
370370
repeat(1..1024, alt(("\r\n", "\n")))
371371
.map(|()| ())
372372
.take()

gix-config/src/parse/nom/tests.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ mod config_name {
167167
}
168168

169169
mod section {
170+
use winnow::error::InputError;
171+
170172
use crate::parse::{
171173
error::ParseNode,
172174
tests::util::{
@@ -177,7 +179,10 @@ mod section {
177179
Event, Section,
178180
};
179181

180-
fn section<'a>(mut i: &'a [u8], node: &mut ParseNode) -> winnow::IResult<&'a [u8], Section<'a>> {
182+
fn section<'a>(
183+
mut i: &'a [u8],
184+
node: &mut ParseNode,
185+
) -> winnow::ModalResult<(&'a [u8], Section<'a>), InputError<&'a [u8]>> {
181186
let mut header = None;
182187
let mut events = Vec::new();
183188
super::section(&mut i, node, &mut |e| match &header {
@@ -507,13 +512,17 @@ mod section {
507512

508513
mod value_continuation {
509514
use bstr::ByteSlice;
515+
use winnow::error::InputError;
510516

511517
use crate::parse::{
512518
tests::util::{newline_custom_event, newline_event, value_done_event, value_not_done_event},
513519
Event,
514520
};
515521

516-
pub fn value_impl<'a>(mut i: &'a [u8], events: &mut Vec<Event<'a>>) -> winnow::IResult<&'a [u8], ()> {
522+
pub fn value_impl<'a>(
523+
mut i: &'a [u8],
524+
events: &mut Vec<Event<'a>>,
525+
) -> winnow::ModalResult<(&'a [u8], ()), InputError<&'a [u8]>> {
517526
super::value_impl(&mut i, &mut |e| events.push(e)).map(|_| (i, ()))
518527
}
519528

@@ -772,6 +781,8 @@ mod value_no_continuation {
772781
}
773782

774783
mod key_value_pair {
784+
use winnow::error::InputError;
785+
775786
use crate::parse::{
776787
error::ParseNode,
777788
tests::util::{name_event, value_event, whitespace_event},
@@ -782,7 +793,7 @@ mod key_value_pair {
782793
mut i: &'a [u8],
783794
node: &mut ParseNode,
784795
events: &mut Vec<Event<'a>>,
785-
) -> winnow::IResult<&'a [u8], ()> {
796+
) -> winnow::ModalResult<(&'a [u8], ()), InputError<&'a [u8]>> {
786797
super::key_value_pair(&mut i, node, &mut |e| events.push(e)).map(|_| (i, ()))
787798
}
788799

gix-object/src/commit/decode.rs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,26 @@ use std::borrow::Cow;
22

33
use smallvec::SmallVec;
44
use winnow::{
5-
combinator::{alt, eof, opt, preceded, repeat, rest, terminated},
5+
combinator::{alt, eof, opt, preceded, repeat, terminated},
66
error::{AddContext, ParserError, StrContext},
77
prelude::*,
88
stream::Stream as _,
9-
token::take_till,
9+
token::{rest, take_till},
1010
};
1111

1212
use crate::{parse, parse::NL, BStr, ByteSlice, CommitRef};
1313

1414
pub fn message<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>(
1515
i: &mut &'a [u8],
16-
) -> PResult<&'a BStr, E> {
16+
) -> ModalResult<&'a BStr, E> {
1717
if i.is_empty() {
1818
// newline + [message]
1919
let start = i.checkpoint();
20-
return Err(
21-
winnow::error::ErrMode::from_error_kind(i, winnow::error::ErrorKind::Eof).add_context(
22-
i,
23-
&start,
24-
StrContext::Expected("newline + <message>".into()),
25-
),
26-
);
20+
return Err(winnow::error::ErrMode::from_input(i).add_context(
21+
i,
22+
&start,
23+
StrContext::Expected("newline + <message>".into()),
24+
));
2725
}
2826
preceded(NL, rest.map(ByteSlice::as_bstr))
2927
.context(StrContext::Expected(
@@ -34,7 +32,7 @@ pub fn message<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>(
3432

3533
pub fn commit<'a, E: ParserError<&'a [u8]> + AddContext<&'a [u8], StrContext>>(
3634
i: &mut &'a [u8],
37-
) -> PResult<CommitRef<'a>, E> {
35+
) -> ModalResult<CommitRef<'a>, E> {
3836
(
3937
(|i: &mut _| parse::header_field(i, b"tree", parse::hex_hash))
4038
.context(StrContext::Expected("tree <40 lowercase hex char>".into())),

gix-object/src/commit/message/body.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use std::ops::Deref;
22

33
use winnow::{
4-
combinator::{eof, rest, separated_pair, terminated},
5-
error::{ErrorKind, ParserError},
4+
combinator::{eof, separated_pair, terminated},
5+
error::ParserError,
66
prelude::*,
7-
token::take_until,
7+
token::{rest, take_until},
88
};
99

1010
use crate::{
@@ -31,12 +31,12 @@ pub struct TrailerRef<'a> {
3131
pub value: &'a BStr,
3232
}
3333

34-
fn parse_single_line_trailer<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> PResult<(&'a BStr, &'a BStr), E> {
34+
fn parse_single_line_trailer<'a, E: ParserError<&'a [u8]>>(i: &mut &'a [u8]) -> ModalResult<(&'a BStr, &'a BStr), E> {
3535
*i = i.trim_end();
3636
let (token, value) = separated_pair(take_until(1.., b":".as_ref()), b": ", rest).parse_next(i)?;
3737

3838
if token.trim_end().len() != token.len() || value.trim_start().len() != value.len() {
39-
Err(winnow::error::ErrMode::from_error_kind(i, ErrorKind::Fail).cut())
39+
Err(winnow::error::ErrMode::from_input(i).cut())
4040
} else {
4141
Ok((token.as_bstr(), value.as_bstr()))
4242
}

0 commit comments

Comments
 (0)