diff options
| author | John Turner <jturner.usa@gmail.com> | 2025-10-28 09:44:32 +0000 |
|---|---|---|
| committer | John Turner <jturner.usa@gmail.com> | 2025-10-28 09:47:41 +0000 |
| commit | b54616a6dd4f512b4ec87c3780c36257e5c322b3 (patch) | |
| tree | 9467d9a2292b0e3ca3587c895e158a1cc372787d /src/useflag/parsers.rs | |
| parent | 92a8e46082a4a3f252cc5fa5afb59716d0657254 (diff) | |
| download | gentoo-utils-b54616a6dd4f512b4ec87c3780c36257e5c322b3.tar.gz | |
impl Parseable trait
Diffstat (limited to 'src/useflag/parsers.rs')
| -rw-r--r-- | src/useflag/parsers.rs | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/src/useflag/parsers.rs b/src/useflag/parsers.rs index 49000d9..6b13a64 100644 --- a/src/useflag/parsers.rs +++ b/src/useflag/parsers.rs @@ -1,26 +1,37 @@ use mon::{Parser, r#if, tag}; -use crate::useflag::{IUseFlag, UseFlag}; +use crate::{ + Parseable, + useflag::{IUseFlag, UseFlag}, +}; -pub fn useflag<'a>() -> impl Parser<&'a str, Output = UseFlag> { - let start = r#if(|c: &char| c.is_ascii_alphanumeric()); - let rest = r#if(|c: &char| c.is_ascii_alphanumeric() || "+_@-".contains(*c)).list(0..); +impl<'a> Parseable<'a, &'a str> for UseFlag { + type Parser = impl Parser<&'a str, Output = Self>; - start - .and(rest) - .recognize() - .map(|output: &str| UseFlag(output.to_string())) + 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)).list(0..); + + start + .and(rest) + .recognize() + .map(|output: &str| UseFlag(output.to_string())) + } } -pub fn iuseflag<'a>() -> impl Parser<&'a str, Output = IUseFlag> { - useflag() - .preceded_by(tag("+")) - .map(|flag| IUseFlag { - default: true, - flag, - }) - .or(useflag().map(|flag| IUseFlag { - default: false, - flag, - })) +impl<'a> Parseable<'a, &'a str> for IUseFlag { + type Parser = impl Parser<&'a str, Output = Self>; + + fn parser() -> Self::Parser { + UseFlag::parser() + .preceded_by(tag("+")) + .map(|flag| IUseFlag { + default: true, + flag, + }) + .or(UseFlag::parser().map(|flag| IUseFlag { + default: false, + flag, + })) + } } |
