impl Parseable trait

This commit is contained in:
John Turner
2025-10-28 09:44:32 +00:00
parent 92a8e46082
commit b54616a6dd
6 changed files with 367 additions and 272 deletions

View File

@@ -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,
}))
}
}