Merge pull request #1220 from epage/w7

chore: Update to Winnow 0.7
This commit is contained in:
Ed Page 2025-01-30 16:01:27 -06:00 committed by GitHub
commit 4f604f6eff
WARNING! Although there is a key with this ID in the database it does not verify this commit! This commit is SUSPICIOUS.
GPG key ID: B5690EEEBB952194
5 changed files with 49 additions and 41 deletions

19
Cargo.lock generated
View file

@ -1451,7 +1451,7 @@ dependencies = [
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
"winnow", "winnow 0.6.26",
] ]
[[package]] [[package]]
@ -1508,7 +1508,7 @@ dependencies = [
"simdutf8", "simdutf8",
"snapbox", "snapbox",
"unicode-xid", "unicode-xid",
"winnow", "winnow 0.7.0",
] ]
[[package]] [[package]]
@ -1702,7 +1702,7 @@ version = "5.0.1"
dependencies = [ dependencies = [
"enumflags2", "enumflags2",
"snapbox", "snapbox",
"winnow", "winnow 0.7.0",
] ]
[[package]] [[package]]
@ -1917,9 +1917,18 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.6.21" version = "0.6.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6f5bb5257f2407a5425c6e749bfd9692192a73e70a6060516ac04f889087d68" checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28"
dependencies = [
"memchr",
]
[[package]]
name = "winnow"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e49d2d35d3fad69b39b94139037ecfb4f359f08958b9c11e7315ce770462419"
dependencies = [ dependencies = [
"memchr", "memchr",
] ]

View file

@ -16,7 +16,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs", "--generate-link-to-definition"] rustdoc-args = ["--cfg", "docsrs", "--generate-link-to-definition"]
[dependencies] [dependencies]
winnow = "0.6.7" winnow = "0.7.0"
unicode-xid = "0.2.4" unicode-xid = "0.2.4"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
simdutf8 = "0.1.4" simdutf8 = "0.1.4"

View file

@ -140,12 +140,13 @@ mod parser {
use winnow::stream::Stream; use winnow::stream::Stream;
use winnow::stream::StreamIsPartial; use winnow::stream::StreamIsPartial;
use winnow::token::{one_of, take_while}; use winnow::token::{one_of, take_while};
use winnow::Result;
/// Avoid worst-case parse times by limiting how much a `take_while` can take if something /// Avoid worst-case parse times by limiting how much a `take_while` can take if something
/// later may cause it to fail. /// later may cause it to fail.
const NON_TERMINATING_CAP: usize = 1024; const NON_TERMINATING_CAP: usize = 1024;
pub(crate) fn next_identifier<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> pub(crate) fn next_identifier<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -155,7 +156,7 @@ mod parser {
preceded(ignore, identifier).parse_next(input) preceded(ignore, identifier).parse_next(input)
} }
fn identifier<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn identifier<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -173,7 +174,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn ignore<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn ignore<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -204,7 +205,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn sep1<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn sep1<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -217,7 +218,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn other<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn other<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -234,7 +235,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn ordinal_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn ordinal_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -260,7 +261,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn dec_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn dec_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -269,7 +270,7 @@ mod parser {
trace("dec_literal", take_while(1.., is_dec_digit_with_sep)).parse_next(input) trace("dec_literal", take_while(1.., is_dec_digit_with_sep)).parse_next(input)
} }
fn hex_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn hex_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -281,7 +282,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn css_color<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn css_color<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -302,7 +303,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn jwt<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn jwt<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -337,7 +338,7 @@ mod parser {
|| c == '-' || c == '-'
} }
fn uuid_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn uuid_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -375,7 +376,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn hash_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn hash_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -401,7 +402,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn base64_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn base64_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -425,10 +426,8 @@ mod parser {
.iter() .iter()
.all(|c| !['/', '+'].contains(&c.as_char())) .all(|c| !['/', '+'].contains(&c.as_char()))
{ {
return Err(winnow::error::ErrMode::from_error_kind( #[allow(clippy::unit_arg)]
input, return Err(ParserError::from_input(input));
winnow::error::ErrorKind::Slice,
));
} }
take_while(padding_len..=padding_len, is_base64_padding).parse_next(input)?; take_while(padding_len..=padding_len, is_base64_padding).parse_next(input)?;
@ -440,7 +439,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn email_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn email_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -459,7 +458,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn url_literal<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn url_literal<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -492,7 +491,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn url_userinfo<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn url_userinfo<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
@ -510,7 +509,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn c_escape<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn c_escape<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,
<T as Stream>::Slice: AsBStr + SliceLen + Default, <T as Stream>::Slice: AsBStr + SliceLen + Default,
@ -531,7 +530,7 @@ mod parser {
.parse_next(input) .parse_next(input)
} }
fn printf<T>(input: &mut T) -> PResult<<T as Stream>::Slice, ()> fn printf<T>(input: &mut T) -> Result<<T as Stream>::Slice, ()>
where where
T: Compare<char>, T: Compare<char>,
T: Stream + StreamIsPartial + PartialEq, T: Stream + StreamIsPartial + PartialEq,

View file

@ -20,7 +20,7 @@ parser = ["dep:winnow"]
flags = ["dep:enumflags2"] flags = ["dep:enumflags2"]
[dependencies] [dependencies]
winnow = { version = "0.6.7", optional = true } winnow = { version = "0.7.0", optional = true }
enumflags2 = { version = "0.7", optional = true } enumflags2 = { version = "0.7", optional = true }
[lints] [lints]

View file

@ -546,7 +546,7 @@ impl Cluster {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Self, ()> { fn parse_(input: &mut &str) -> ModalResult<Self, ()> {
trace("cluster", move |input: &mut &str| { trace("cluster", move |input: &mut &str| {
let header = ( let header = (
"#", "#",
@ -966,7 +966,7 @@ impl Entry {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Self, ()> { fn parse_(input: &mut &str) -> ModalResult<Self, ()> {
trace("entry", move |input: &mut &str| { trace("entry", move |input: &mut &str| {
let var_sep = (winnow::ascii::space0, '/', winnow::ascii::space0); let var_sep = (winnow::ascii::space0, '/', winnow::ascii::space0);
let variants = let variants =
@ -987,7 +987,7 @@ impl Entry {
.parse_next(input) .parse_next(input)
} }
fn parse_description(input: &mut &str) -> PResult<Self, ()> { fn parse_description(input: &mut &str) -> ModalResult<Self, ()> {
trace("description", move |input: &mut &str| { trace("description", move |input: &mut &str| {
let mut entry = Self { let mut entry = Self {
variants: Vec::new(), variants: Vec::new(),
@ -1023,18 +1023,18 @@ impl Entry {
} }
} }
fn note(input: &mut &str) -> PResult<String, ()> { fn note(input: &mut &str) -> ModalResult<String, ()> {
let (_, _, note) = (NOTE_PREFIX, space1, description).parse_next(input)?; let (_, _, note) = (NOTE_PREFIX, space1, description).parse_next(input)?;
Ok(note) Ok(note)
} }
const NOTE_PREFIX: &str = "--"; const NOTE_PREFIX: &str = "--";
fn archaic(input: &mut &str) -> PResult<(), ()> { fn archaic(input: &mut &str) -> ModalResult<(), ()> {
"(-)".void().parse_next(input) "(-)".void().parse_next(input)
} }
fn description(input: &mut &str) -> PResult<String, ()> { fn description(input: &mut &str) -> ModalResult<String, ()> {
let description = winnow::token::take_till(0.., ('\n', '\r', '#', '|')).parse_next(input)?; let description = winnow::token::take_till(0.., ('\n', '\r', '#', '|')).parse_next(input)?;
Ok(description.to_owned()) Ok(description.to_owned())
} }
@ -1573,7 +1573,7 @@ impl Variant {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Self, ()> { fn parse_(input: &mut &str) -> ModalResult<Self, ()> {
trace("variant", move |input: &mut &str| { trace("variant", move |input: &mut &str| {
let types = winnow::combinator::separated(1.., Type::parse_, space1); let types = winnow::combinator::separated(1.., Type::parse_, space1);
let columns = let columns =
@ -1592,7 +1592,7 @@ impl Variant {
} }
} }
fn word(input: &mut &str) -> PResult<String, ()> { fn word(input: &mut &str) -> ModalResult<String, ()> {
trace("word", move |input: &mut &str| { trace("word", move |input: &mut &str| {
winnow::token::take_till(1.., |item: char| item.is_ascii_whitespace()) winnow::token::take_till(1.., |item: char| item.is_ascii_whitespace())
.map(|s: &str| s.to_owned().replace('_', " ")) .map(|s: &str| s.to_owned().replace('_', " "))
@ -1734,7 +1734,7 @@ impl Type {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Type, ()> { fn parse_(input: &mut &str) -> ModalResult<Type, ()> {
trace("type", move |input: &mut &str| { trace("type", move |input: &mut &str| {
let category = Category::parse_(input)?; let category = Category::parse_(input)?;
let tag = opt(Tag::parse_).parse_next(input)?; let tag = opt(Tag::parse_).parse_next(input)?;
@ -1850,7 +1850,7 @@ impl Category {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Self, ()> { fn parse_(input: &mut &str) -> ModalResult<Self, ()> {
trace("category", move |input: &mut &str| { trace("category", move |input: &mut &str| {
let symbols = one_of(['A', 'B', 'Z', 'C', 'D', '_']); let symbols = one_of(['A', 'B', 'Z', 'C', 'D', '_']);
symbols symbols
@ -1909,7 +1909,7 @@ impl Tag {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Self, ()> { fn parse_(input: &mut &str) -> ModalResult<Self, ()> {
trace("tag", move |input: &mut &str| { trace("tag", move |input: &mut &str| {
let symbols = one_of(['.', 'v', 'V', '-', 'x']); let symbols = one_of(['.', 'v', 'V', '-', 'x']);
symbols symbols
@ -1967,7 +1967,7 @@ impl Pos {
Self::parse_.parse(input).map_err(|_err| ParseError) Self::parse_.parse(input).map_err(|_err| ParseError)
} }
fn parse_(input: &mut &str) -> PResult<Self, ()> { fn parse_(input: &mut &str) -> ModalResult<Self, ()> {
trace("pos", move |input: &mut &str| { trace("pos", move |input: &mut &str| {
alt(( alt((
"N".value(Pos::Noun), "N".value(Pos::Noun),