@@ -3,9 +3,9 @@ use std::borrow::Cow;
3
3
use bstr:: { BStr , ByteSlice } ;
4
4
use winnow:: {
5
5
combinator:: { alt, delimited, opt, preceded, repeat} ,
6
- error:: { ErrorKind , InputError as NomError , ParserError as _} ,
6
+ error:: { ErrMode , InputError as NomError , ParserError as _} ,
7
7
prelude:: * ,
8
- stream:: { Offset as _, Stream as _ } ,
8
+ stream:: Offset as _,
9
9
token:: { one_of, take_till, take_while} ,
10
10
} ;
11
11
@@ -78,7 +78,7 @@ fn newlines_from(input: &[u8], start: winnow::stream::Checkpoint<&[u8], &[u8]>)
78
78
start_input. next_slice ( offset) . iter ( ) . filter ( |c| * * c == b'\n' ) . count ( )
79
79
}
80
80
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 ] > > {
82
82
(
83
83
one_of ( [ ';' , '#' ] ) ,
84
84
take_till ( 0 .., |c| c == b'\n' ) . map ( |text : & [ u8 ] | Cow :: Borrowed ( text. as_bstr ( ) ) ) ,
@@ -94,7 +94,7 @@ fn section<'i>(
94
94
i : & mut & ' i [ u8 ] ,
95
95
node : & mut ParseNode ,
96
96
dispatch : & mut dyn FnMut ( Event < ' i > ) ,
97
- ) -> PResult < ( ) , NomError < & ' i [ u8 ] > > {
97
+ ) -> ModalResult < ( ) , NomError < & ' i [ u8 ] > > {
98
98
let start = i. checkpoint ( ) ;
99
99
let header = section_header ( i) . map_err ( |e| {
100
100
i. reset ( & start) ;
@@ -129,11 +129,14 @@ fn section<'i>(
129
129
Ok ( ( ) )
130
130
}
131
131
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 ] > > {
133
133
// No spaces must be between section name and section start
134
134
let name = preceded ( '[' , take_while ( 1 .., is_section_char) . map ( bstr:: ByteSlice :: as_bstr) ) . parse_next ( i) ?;
135
135
136
- if opt ( one_of :: < _ , _ , NomError < & [ u8 ] > > ( ']' ) ) . parse_next ( i) ?. is_some ( ) {
136
+ if opt ( one_of :: < _ , _ , ErrMode < NomError < & [ u8 ] > > > ( ']' ) )
137
+ . parse_next ( i) ?
138
+ . is_some ( )
139
+ {
137
140
// Either section does not have a subsection or using deprecated
138
141
// subsection syntax at this point.
139
142
let header = match memchr:: memrchr ( b'.' , name. as_bytes ( ) ) {
@@ -150,7 +153,7 @@ fn section_header<'i>(i: &mut &'i [u8]) -> PResult<section::Header<'i>, NomError
150
153
} ;
151
154
152
155
if header. name . is_empty ( ) {
153
- return Err ( winnow:: error:: ErrMode :: from_error_kind ( i , ErrorKind :: Fail ) ) ;
156
+ return Err ( winnow:: error:: ErrMode :: from_input ( i ) ) ;
154
157
}
155
158
return Ok ( header) ;
156
159
}
@@ -169,7 +172,7 @@ fn is_section_char(c: u8) -> bool {
169
172
c. is_ascii_alphanumeric ( ) || c == b'-' || c == b'.'
170
173
}
171
174
172
- fn sub_section < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < Cow < ' i , BStr > , NomError < & ' i [ u8 ] > > {
175
+ fn sub_section < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < Cow < ' i , BStr > , NomError < & ' i [ u8 ] > > {
173
176
let mut output = Cow :: Borrowed ( Default :: default ( ) ) ;
174
177
if let Some ( sub) = opt ( subsection_subset) . parse_next ( i) ? {
175
178
output = Cow :: Borrowed ( sub. as_bstr ( ) ) ;
@@ -181,15 +184,15 @@ fn sub_section<'i>(i: &mut &'i [u8]) -> PResult<Cow<'i, BStr>, NomError<&'i [u8]
181
184
Ok ( output)
182
185
}
183
186
184
- fn subsection_subset < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < & ' i [ u8 ] , NomError < & ' i [ u8 ] > > {
187
+ fn subsection_subset < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < & ' i [ u8 ] , NomError < & ' i [ u8 ] > > {
185
188
alt ( ( subsection_unescaped, subsection_escaped_char) ) . parse_next ( i)
186
189
}
187
190
188
- fn subsection_unescaped < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < & ' i [ u8 ] , NomError < & ' i [ u8 ] > > {
191
+ fn subsection_unescaped < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < & ' i [ u8 ] , NomError < & ' i [ u8 ] > > {
189
192
take_while ( 1 .., is_subsection_unescaped_char) . parse_next ( i)
190
193
}
191
194
192
- fn subsection_escaped_char < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < & ' i [ u8 ] , NomError < & ' i [ u8 ] > > {
195
+ fn subsection_escaped_char < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < & ' i [ u8 ] , NomError < & ' i [ u8 ] > > {
193
196
preceded ( '\\' , one_of ( is_subsection_escapable_char) . take ( ) ) . parse_next ( i)
194
197
}
195
198
@@ -205,7 +208,7 @@ fn key_value_pair<'i>(
205
208
i : & mut & ' i [ u8 ] ,
206
209
node : & mut ParseNode ,
207
210
dispatch : & mut dyn FnMut ( Event < ' i > ) ,
208
- ) -> PResult < ( ) , NomError < & ' i [ u8 ] > > {
211
+ ) -> ModalResult < ( ) , NomError < & ' i [ u8 ] > > {
209
212
* node = ParseNode :: Name ;
210
213
if let Some ( name) = opt ( config_name) . parse_next ( i) ? {
211
214
dispatch ( Event :: SectionValueName ( section:: ValueName ( Cow :: Borrowed ( name) ) ) ) ;
@@ -223,7 +226,7 @@ fn key_value_pair<'i>(
223
226
224
227
/// Parses the config name of a config pair. Assumes the input has already been
225
228
/// trimmed of any leading whitespace.
226
- fn config_name < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < & ' i BStr , NomError < & ' i [ u8 ] > > {
229
+ fn config_name < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < & ' i BStr , NomError < & ' i [ u8 ] > > {
227
230
(
228
231
one_of ( |c : u8 | c. is_ascii_alphabetic ( ) ) ,
229
232
take_while ( 0 .., |c : u8 | c. is_ascii_alphanumeric ( ) || c == b'-' ) ,
@@ -233,7 +236,7 @@ fn config_name<'i>(i: &mut &'i [u8]) -> PResult<&'i BStr, NomError<&'i [u8]>> {
233
236
. parse_next ( i)
234
237
}
235
238
236
- fn config_value < ' i > ( i : & mut & ' i [ u8 ] , dispatch : & mut dyn FnMut ( Event < ' i > ) ) -> PResult < ( ) , NomError < & ' i [ u8 ] > > {
239
+ fn config_value < ' i > ( i : & mut & ' i [ u8 ] , dispatch : & mut dyn FnMut ( Event < ' i > ) ) -> ModalResult < ( ) , NomError < & ' i [ u8 ] > > {
237
240
if opt ( '=' ) . parse_next ( i) ?. is_some ( ) {
238
241
dispatch ( Event :: KeyValueSeparator ) ;
239
242
if let Some ( whitespace) = opt ( take_spaces1) . parse_next ( i) ? {
@@ -251,7 +254,7 @@ fn config_value<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PR
251
254
252
255
/// Handles parsing of known-to-be values. This function handles both single
253
256
/// 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 ] > > {
257
+ fn value_impl < ' i > ( i : & mut & ' i [ u8 ] , dispatch : & mut dyn FnMut ( Event < ' i > ) ) -> ModalResult < ( ) , NomError < & ' i [ u8 ] > > {
255
258
let start_checkpoint = i. checkpoint ( ) ;
256
259
let mut value_start_checkpoint = i. checkpoint ( ) ;
257
260
let mut value_end = None ;
@@ -278,17 +281,17 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
278
281
let escape_index = escaped_index - 1 ;
279
282
let Some ( mut c) = i. next_token ( ) else {
280
283
i. reset ( & start_checkpoint) ;
281
- return Err ( winnow:: error:: ErrMode :: from_error_kind ( i , ErrorKind :: Token ) ) ;
284
+ return Err ( winnow:: error:: ErrMode :: from_input ( i ) ) ;
282
285
} ;
283
286
let mut consumed = 1 ;
284
287
if c == b'\r' {
285
288
c = i. next_token ( ) . ok_or_else ( || {
286
289
i. reset ( & start_checkpoint) ;
287
- winnow:: error:: ErrMode :: from_error_kind ( i , ErrorKind :: Token )
290
+ winnow:: error:: ErrMode :: from_input ( i )
288
291
} ) ?;
289
292
if c != b'\n' {
290
293
i. reset ( & start_checkpoint) ;
291
- return Err ( winnow:: error:: ErrMode :: from_error_kind ( i , ErrorKind :: Slice ) ) ;
294
+ return Err ( winnow:: error:: ErrMode :: from_input ( i ) ) ;
292
295
}
293
296
consumed += 1 ;
294
297
}
@@ -313,7 +316,7 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
313
316
b'n' | b't' | b'\\' | b'b' | b'"' => { }
314
317
_ => {
315
318
i. reset ( & start_checkpoint) ;
316
- return Err ( winnow:: error:: ErrMode :: from_error_kind ( i , ErrorKind :: Token ) ) ;
319
+ return Err ( winnow:: error:: ErrMode :: from_input ( i ) ) ;
317
320
}
318
321
}
319
322
}
@@ -326,7 +329,7 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
326
329
}
327
330
if is_in_quotes {
328
331
i. reset ( & start_checkpoint) ;
329
- return Err ( winnow:: error:: ErrMode :: from_error_kind ( i , ErrorKind :: Slice ) ) ;
332
+ return Err ( winnow:: error:: ErrMode :: from_input ( i ) ) ;
330
333
}
331
334
332
335
let value_end = match value_end {
@@ -360,13 +363,13 @@ fn value_impl<'i>(i: &mut &'i [u8], dispatch: &mut dyn FnMut(Event<'i>)) -> PRes
360
363
Ok ( ( ) )
361
364
}
362
365
363
- fn take_spaces1 < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < & ' i BStr , NomError < & ' i [ u8 ] > > {
366
+ fn take_spaces1 < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < & ' i BStr , NomError < & ' i [ u8 ] > > {
364
367
take_while ( 1 .., winnow:: stream:: AsChar :: is_space)
365
368
. map ( bstr:: ByteSlice :: as_bstr)
366
369
. parse_next ( i)
367
370
}
368
371
369
- fn take_newlines1 < ' i > ( i : & mut & ' i [ u8 ] ) -> PResult < & ' i BStr , NomError < & ' i [ u8 ] > > {
372
+ fn take_newlines1 < ' i > ( i : & mut & ' i [ u8 ] ) -> ModalResult < & ' i BStr , NomError < & ' i [ u8 ] > > {
370
373
repeat ( 1 ..1024 , alt ( ( "\r \n " , "\n " ) ) )
371
374
. map ( |( ) | ( ) )
372
375
. take ( )
0 commit comments