History

Merge branch 'winnow'

Sebastian Thiel committed 3 years ago

Commit 37ade022 parents 146c149 3cd460b3 files · +55 −60Browse files

Unified · Split

3 files
  1. cargo-smart-release/Cargo.lock +3 −3
  2. cargo-smart-release/Cargo.toml +1 −1
  3. cargo-smart-release/src/changelog/parse.rs +51 −56
cargo-smart-release/Cargo.lock+3−3
@@ -181,11 +181,11 @@ dependencies = [ · 180 unmodified lines
181181 "home",
182182 "insta",
183183 "log",
184− "nom",
185184 "pulldown-cmark",
186185 "semver",
187186 "time",
188187 "toml_edit",
188+ "winnow",
189189 ]
190190
191191 [[package]]
@@ -2710,9 +2710,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" · 2518 unmodified lines
27102710
27112711 [[package]]
27122712 name = "winnow"
2713−version = "0.5.0"
2713+version = "0.5.1"
27142714 source = "registry+https://github.com/rust-lang/crates.io-index"
2715−checksum = "81fac9742fd1ad1bd9643b991319f72dd031016d44b77039a26977eb667141e7"
2715+checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11"
27162716 dependencies = [
27172717 "memchr",
27182718 ]
cargo-smart-release/Cargo.toml+1−1
@@ -34,7 +34,7 @@ toml_edit = "0.19.1" · 33 unmodified lines
3434 semver = "1.0.4"
3535 crates-index = { version = "1.0.0", git = "https://github.com/Byron/rust-crates-index", branch = "replace-git2-with-gitoxide" }
3636 cargo_toml = "0.15.1"
37−nom = { version = "7", default-features = false, features = ["std"]}
37+winnow = "0.5.1"
3838 git-conventional = "0.12.0"
3939 time = "0.3.19"
4040 pulldown-cmark = "0.9.0"
cargo-smart-release/src/changelog/parse.rs+51−56
@@ -6,15 +6,15 @@ use std::{ · 5 unmodified lines
66 };
77
88 use gix::bstr::ByteSlice;
9−use nom::{
10− branch::alt,
11− bytes::complete::{tag, tag_no_case, take_till, take_while, take_while_m_n},
12− combinator::{all_consuming, map, map_res, opt},
13− error::{FromExternalError, ParseError},
14− sequence::{delimited, preceded, separated_pair, terminated, tuple},
15− Finish, IResult,
16−};
179 use pulldown_cmark::{CowStr, Event, HeadingLevel, OffsetIter, Tag};
10+use winnow::{
11+ combinator::alt,
12+ combinator::opt,
13+ combinator::{delimited, preceded, separated_pair, terminated},
14+ error::{FromExternalError, ParserError},
15+ prelude::*,
16+ token::{tag_no_case, take_till0, take_while},
17+};
1818
1919 use crate::{
2020 changelog,
@@ -467,59 +467,54 @@ impl<'a> TryFrom<&'a str> for Headline { · 446 unmodified lines
467467 type Error = ();
468468
469469 fn try_from(value: &'a str) -> Result<Self, Self::Error> {
470− all_consuming(headline::<()>)(value).finish().map(|(_, h)| h)
470+ headline::<()>.parse(value).map_err(|err| err.into_inner())
471471 }
472472 }
473473
474−fn headline<'a, E: ParseError<&'a str> + FromExternalError<&'a str, ()>>(i: &'a str) -> IResult<&'a str, Headline, E> {
475− let hashes = take_while(|c: char| c == '#');
476− let greedy_whitespace = |i| take_while(char::is_whitespace)(i);
477− let take_n_digits = |n: usize| {
478− map_res(take_while_m_n(n, n, |c: char| c.is_ascii_digit()), |num| {
479− u32::from_str(num).map_err(|_| ())
480− })
481− };
482− map(
483− terminated(
484− tuple((
485− separated_pair(
486− hashes,
487− greedy_whitespace,
488− alt((
489− tuple((
490− opt(tag("v")),
491− map_res(take_till(char::is_whitespace), |v| {
492− semver::Version::parse(v).map_err(|_| ()).map(Some)
493− }),
494− )),
495− map(tag_no_case("unreleased"), |_| (None, None)),
496− )),
497− ),
498− opt(preceded(
499− greedy_whitespace,
500− delimited(
501− tag("("),
502− map_res(
503− tuple((take_n_digits(4), tag("-"), take_n_digits(2), tag("-"), take_n_digits(2))),
504− |(year, _, month, _, day)| {
505− time::Month::try_from(month as u8).map_err(|_| ()).and_then(|month| {
506− time::Date::from_calendar_date(year as i32, month, day as u8)
507− .map_err(|_| ())
508− .map(|d| d.midnight().assume_utc())
509− })
510− },
511− ),
512− tag(")"),
474+fn headline<'a, E: ParserError<&'a str> + FromExternalError<&'a str, ()>>(i: &mut &'a str) -> PResult<Headline, E> {
475+ let hashes = take_while(0.., |c: char| c == '#');
476+ let greedy_whitespace = |i: &mut &'a str| take_while(0.., char::is_whitespace).parse_next(i);
477+ let take_n_digits =
478+ |n: usize| take_while(n, |c: char| c.is_ascii_digit()).try_map(|num| u32::from_str(num).map_err(|_| ()));
479+
480+ terminated(
481+ (
482+ separated_pair(
483+ hashes,
484+ greedy_whitespace,
485+ alt((
486+ (
487+ opt("v"),
488+ take_till0(char::is_whitespace)
489+ .try_map(|v| semver::Version::parse(v).map_err(|_| ()).map(Some)),
513490 ),
491+ tag_no_case("unreleased").map(|_| (None, None)),
514492 )),
493+ ),
494+ opt(preceded(
495+ greedy_whitespace,
496+ delimited(
497+ "(",
498+ (take_n_digits(4), "-", take_n_digits(2), "-", take_n_digits(2)).try_map(
499+ |(year, _, month, _, day)| {
500+ time::Month::try_from(month as u8).map_err(|_| ()).and_then(|month| {
501+ time::Date::from_calendar_date(year as i32, month, day as u8)
502+ .map_err(|_| ())
503+ .map(|d| d.midnight().assume_utc())
504+ })
505+ },
506+ ),
507+ ")",
508+ ),
515509 )),
516− greedy_whitespace,
517510 ),
518− |((hashes, (prefix, version)), date)| Headline {
519− level: hashes.len(),
520− version_prefix: prefix.map_or_else(String::new, ToOwned::to_owned),
521− version,
522− date,
523− },
524− )(i)
511+ greedy_whitespace,
512+ )
513+ .map(|((hashes, (prefix, version)), date)| Headline {
514+ level: hashes.len(),
515+ version_prefix: prefix.map_or_else(String::new, ToOwned::to_owned),
516+ version,
517+ date,
518+ })
519+ .parse_next(i)
525520 }