diff --git a/src/atom/parsers.rs b/src/atom/parsers.rs index 37e18a7..d3eaf7a 100644 --- a/src/atom/parsers.rs +++ b/src/atom/parsers.rs @@ -1,6 +1,6 @@ use core::option::Option::None; -use mon::{Parser, ParserIter, r#if, numeric1, one_of, tag}; +use mon::{Parser, ParserIter, alphanumeric, r#if, numeric1, one_of, tag}; use crate::{ Parseable, @@ -115,10 +115,8 @@ impl<'a> Parseable<'a, &'a str> for Category { type Parser = impl Parser<&'a str, Output = Self>; fn parser() -> Self::Parser { - let start = r#if(|c: &char| c.is_ascii_alphanumeric() || *c == '_'); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "+_.-".contains(*c)) - .repeated() - .many(); + let start = alphanumeric().or(one_of("_".chars())); + let rest = alphanumeric().or(one_of("+_.-".chars())).repeated().many(); start .and(rest) @@ -131,13 +129,15 @@ impl<'a> Parseable<'a, &'a str> for Name { type Parser = impl Parser<&'a str, Output = Self>; fn parser() -> Self::Parser { - let start = r#if(|c: &char| c.is_ascii_alphanumeric() || *c == '_'); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "_+".contains(*c)) - .or( - one_of("-".chars()).and_not(Version::parser().preceded_by(tag("-")).followed_by( - r#if(|c: &char| c.is_ascii_alphanumeric() || "_+-".contains(*c)).not(), - )), - ) + let start = alphanumeric().or(one_of("_".chars())); + + let rest = alphanumeric() + .or(one_of("_+".chars())) + .or(one_of("-".chars()).and_not( + Version::parser() + .preceded_by(tag("-")) + .followed_by(alphanumeric().or(one_of("_+-".chars())).not()), + )) .repeated() .many(); @@ -162,10 +162,8 @@ impl<'a> Parseable<'a, &'a str> for SlotName { type Parser = impl Parser<&'a str, Output = Self>; fn parser() -> Self::Parser { - let start = r#if(|c: &char| c.is_ascii_alphanumeric() || *c == '_'); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "+_.-".contains(*c)) - .repeated() - .many(); + let start = alphanumeric().or(one_of("_".chars())); + let rest = alphanumeric().or(one_of("+_.-".chars())).repeated().many(); start .and(rest) diff --git a/src/ebuild/parsers.rs b/src/ebuild/parsers.rs index f685df3..8ab2978 100644 --- a/src/ebuild/parsers.rs +++ b/src/ebuild/parsers.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use mon::{Parser, ParserIter, alpha1, r#if, tag, whitespace1}; +use mon::{Parser, ParserIter, alpha1, alphanumeric, r#if, one_of, tag, whitespace1}; use crate::{ Parseable, @@ -48,6 +48,7 @@ impl<'a> Parseable<'a, &'a str> for SrcUri { .recognize() .map(|output: &str| PathBuf::from(output)) }; + let uri = UriPrefix::parser() .opt() .and(Uri::parser()) @@ -66,10 +67,8 @@ impl<'a> Parseable<'a, &'a str> for License { type Parser = impl Parser<&'a str, Output = Self>; fn parser() -> Self::Parser { - let start = r#if(|c: &char| c.is_ascii_alphanumeric() || "_".contains(*c)); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "+_.-".contains(*c)) - .repeated() - .many(); + let start = alphanumeric().or(one_of("_".chars())); + let rest = alphanumeric().or(one_of("+_.-".chars())).repeated().many(); start .and(rest) @@ -82,10 +81,8 @@ impl<'a> Parseable<'a, &'a str> for Eapi { type Parser = impl Parser<&'a str, Output = Self>; fn parser() -> Self::Parser { - let start = r#if(|c: &char| c.is_ascii_alphanumeric() || "_".contains(*c)); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "+_.-".contains(*c)) - .repeated() - .many(); + let start = alphanumeric().or(one_of("_".chars())); + let rest = alphanumeric().or(one_of("+_.-".chars())).repeated().many(); start .and(rest) diff --git a/src/useflag/parsers.rs b/src/useflag/parsers.rs index d9aaf21..fc371a6 100644 --- a/src/useflag/parsers.rs +++ b/src/useflag/parsers.rs @@ -1,4 +1,4 @@ -use mon::{Parser, ParserIter, r#if, tag}; +use mon::{Parser, ParserIter, alphanumeric, one_of, tag}; use crate::{ Parseable, @@ -9,10 +9,8 @@ impl<'a> Parseable<'a, &'a str> for UseFlag { type Parser = impl Parser<&'a str, Output = Self>; fn parser() -> Self::Parser { - let start = r#if(|c: &char| c.is_ascii_alphanumeric()); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "+_@-".contains(*c)) - .repeated() - .many(); + let start = alphanumeric(); + let rest = alphanumeric().or(one_of("+_@-".chars())).repeated().many(); start .and(rest)