Skip to content
This repository was archived by the owner on Apr 2, 2026. It is now read-only.

Commit a283b15

Browse files
authored
fix: label all errors that occur in text parsers (#826) (#834)
2 parents 317fabe + 0f99a9a commit a283b15

1 file changed

Lines changed: 62 additions & 94 deletions

File tree

src/text.rs

Lines changed: 62 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,12 @@ where
259259
E::Error: LabelError<'src, I, TextExpected<'src, I>>,
260260
{
261261
any()
262-
.try_map(|c: I::Token, span| {
263-
if c.is_whitespace() {
264-
Ok(())
265-
} else {
266-
Err(LabelError::expected_found(
267-
[TextExpected::Whitespace],
268-
Some(MaybeRef::Val(c)),
269-
span,
270-
))
271-
}
262+
.filter(|c: &I::Token| c.is_whitespace())
263+
.map_err(|mut err: E::Error| {
264+
err.label_with(TextExpected::Whitespace);
265+
err
272266
})
267+
.ignored()
273268
.repeated()
274269
}
275270

@@ -300,17 +295,12 @@ where
300295
E::Error: LabelError<'src, I, TextExpected<'src, I>>,
301296
{
302297
any()
303-
.try_map(|c: I::Token, span| {
304-
if c.is_inline_whitespace() {
305-
Ok(())
306-
} else {
307-
Err(LabelError::expected_found(
308-
[TextExpected::InlineWhitespace],
309-
Some(MaybeRef::Val(c)),
310-
span,
311-
))
312-
}
298+
.filter(|c: &I::Token| c.is_inline_whitespace())
299+
.map_err(|mut err: E::Error| {
300+
err.label_with(TextExpected::InlineWhitespace);
301+
err
313302
})
303+
.ignored()
314304
.repeated()
315305
}
316306

@@ -416,16 +406,10 @@ where
416406
E::Error: LabelError<'src, I, TextExpected<'src, I>>,
417407
{
418408
any()
419-
.try_map(move |c: I::Token, span| {
420-
if c.is_digit(radix) {
421-
Ok(c)
422-
} else {
423-
Err(LabelError::expected_found(
424-
[TextExpected::Digit(0..radix)],
425-
Some(MaybeRef::Val(c)),
426-
span,
427-
))
428-
}
409+
.filter(move |c: &I::Token| c.is_digit(radix))
410+
.map_err(move |mut err: E::Error| {
411+
err.label_with(TextExpected::Digit(0..radix));
412+
err
429413
})
430414
.repeated()
431415
.at_least(1)
@@ -471,29 +455,17 @@ where
471455
LabelError<'src, I, TextExpected<'src, I>> + LabelError<'src, I, MaybeRef<'src, I::Token>>,
472456
{
473457
any()
474-
.try_map(move |c: I::Token, span| {
475-
if c.is_digit(radix) && c != I::Token::digit_zero() {
476-
Ok(c)
477-
} else {
478-
Err(LabelError::expected_found(
479-
[TextExpected::Digit(1..radix)],
480-
Some(MaybeRef::Val(c)),
481-
span,
482-
))
483-
}
458+
.filter(move |c: &I::Token| c.is_digit(radix) && c != &I::Token::digit_zero())
459+
.map_err(move |mut err: E::Error| {
460+
err.label_with(TextExpected::Digit(1..radix));
461+
err
484462
})
485463
.then(
486464
any()
487-
.try_map(move |c: I::Token, span| {
488-
if c.is_digit(radix) {
489-
Ok(())
490-
} else {
491-
Err(LabelError::expected_found(
492-
[TextExpected::Digit(0..radix)],
493-
Some(MaybeRef::Val(c)),
494-
span,
495-
))
496-
}
465+
.filter(move |c: &I::Token| c.is_digit(radix))
466+
.map_err(move |mut err: E::Error| {
467+
err.label_with(TextExpected::Digit(0..radix));
468+
err
497469
})
498470
.repeated(),
499471
)
@@ -522,34 +494,23 @@ pub mod ascii {
522494
E::Error: LabelError<'src, I, TextExpected<'src, I>>,
523495
{
524496
any()
525-
.try_map(|c: I::Token, span| {
526-
if c.to_ascii()
527-
.map(|i| i.is_ascii_alphabetic() || i == b'_')
528-
.unwrap_or(false)
529-
{
530-
Ok(c)
531-
} else {
532-
Err(LabelError::expected_found(
533-
[TextExpected::IdentifierPart],
534-
Some(MaybeRef::Val(c)),
535-
span,
536-
))
537-
}
497+
.filter(|c: &I::Token| {
498+
c.to_ascii()
499+
.map_or(false, |i| i.is_ascii_alphabetic() || i == b'_')
500+
})
501+
.map_err(|mut err: E::Error| {
502+
err.label_with(TextExpected::IdentifierPart);
503+
err
538504
})
539505
.then(
540506
any()
541-
.try_map(|c: I::Token, span| {
542-
if c.to_ascii()
507+
.filter(|c: &I::Token| {
508+
c.to_ascii()
543509
.map_or(false, |i| i.is_ascii_alphanumeric() || i == b'_')
544-
{
545-
Ok(())
546-
} else {
547-
Err(LabelError::expected_found(
548-
[TextExpected::IdentifierPart],
549-
Some(MaybeRef::Val(c)),
550-
span,
551-
))
552-
}
510+
})
511+
.map_err(|mut err: E::Error| {
512+
err.label_with(TextExpected::IdentifierPart);
513+
err
553514
})
554515
.repeated(),
555516
)
@@ -945,29 +906,17 @@ pub mod unicode {
945906
E::Error: LabelError<'src, I, TextExpected<'src, I>>,
946907
{
947908
any()
948-
.try_map(|c: I::Token, span| {
949-
if c.is_ident_start() {
950-
Ok(c)
951-
} else {
952-
Err(LabelError::expected_found(
953-
[TextExpected::IdentifierPart],
954-
Some(MaybeRef::Val(c)),
955-
span,
956-
))
957-
}
909+
.filter(|c: &I::Token| c.is_ident_start())
910+
.map_err(|mut err: E::Error| {
911+
err.label_with(TextExpected::IdentifierPart);
912+
err
958913
})
959914
.then(
960915
any()
961-
.try_map(|c: I::Token, span| {
962-
if c.is_ident_continue() {
963-
Ok(c)
964-
} else {
965-
Err(LabelError::expected_found(
966-
[TextExpected::IdentifierPart],
967-
Some(MaybeRef::Val(c)),
968-
span,
969-
))
970-
}
916+
.filter(|c: &I::Token| c.is_ident_continue())
917+
.map_err(|mut err: E::Error| {
918+
err.label_with(TextExpected::IdentifierPart);
919+
err
971920
})
972921
.repeated(),
973922
)
@@ -1124,6 +1073,25 @@ mod tests {
11241073
test_err(ident, "123");
11251074
}
11261075

1076+
#[test]
1077+
fn whitespace() {
1078+
use crate::{whitespace, LabelError, TextExpected};
1079+
1080+
let parser = whitespace::<&str, extra::Err<Rich<_>>>().exactly(1);
1081+
1082+
assert_eq!(
1083+
parser.parse("").into_output_errors(),
1084+
(
1085+
None,
1086+
vec![LabelError::<&str, _>::expected_found(
1087+
vec![TextExpected::<&str>::Whitespace],
1088+
None,
1089+
SimpleSpan::new((), 0..0)
1090+
)]
1091+
)
1092+
);
1093+
}
1094+
11271095
/*
11281096
#[test]
11291097
#[should_panic]

0 commit comments

Comments
 (0)