summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2025-10-29 12:50:07 +0000
committerJohn Turner <jturner.usa@gmail.com>2025-10-29 12:50:07 +0000
commitb5765118fead09f3501e99bcb4cc19496912040d (patch)
treeeaefc8fa107680ac4414c25d5637e9fffbefc324
parentbdd1188409947bb92910cbd5b1b7039ed805273a (diff)
downloadgentoo-utils-b5765118fead09f3501e99bcb4cc19496912040d.tar.gz
make depend::Expr generic over Parseables
-rw-r--r--src/depend/mod.rs14
-rw-r--r--src/depend/parsers.rs14
-rw-r--r--tests/depend.rs3
3 files changed, 18 insertions, 13 deletions
diff --git a/src/depend/mod.rs b/src/depend/mod.rs
index 9a7fb71..1d85005 100644
--- a/src/depend/mod.rs
+++ b/src/depend/mod.rs
@@ -1,4 +1,4 @@
-use crate::{atom::Atom, useflag::UseFlag};
+use crate::useflag::UseFlag;
pub mod parsers;
@@ -9,10 +9,10 @@ pub enum Conditional {
}
#[derive(Clone, Debug)]
-pub enum Expr {
- Atom(Atom),
- AllOf(Vec<Expr>),
- AnyOf(Vec<Expr>),
- OneOf(Vec<Expr>),
- ConditionalGroup(Conditional, Vec<Expr>),
+pub enum Expr<T> {
+ Element(T),
+ AllOf(Vec<Self>),
+ AnyOf(Vec<Self>),
+ OneOf(Vec<Self>),
+ ConditionalGroup(Conditional, Vec<Self>),
}
diff --git a/src/depend/parsers.rs b/src/depend/parsers.rs
index a17c387..975bbe6 100644
--- a/src/depend/parsers.rs
+++ b/src/depend/parsers.rs
@@ -2,12 +2,14 @@ use mon::{Parser, tag, whitespace1};
use crate::{
Parseable,
- atom::Atom,
depend::{Conditional, Expr},
useflag::UseFlag,
};
-impl<'a> Parseable<'a, &'a str> for Expr {
+impl<'a, T> Parseable<'a, &'a str> for Expr<T>
+where
+ T: Parseable<'a, &'a str>,
+{
type Parser = impl Parser<&'a str, Output = Self>;
fn parser() -> Self::Parser {
@@ -38,8 +40,8 @@ impl<'a> Parseable<'a, &'a str> for Expr {
)
.map(|(conditional, exprs)| Expr::ConditionalGroup(conditional, exprs));
- Atom::parser()
- .map(|atom| Expr::Atom(atom))
+ T::parser()
+ .map(|e| Expr::Element(e))
.or(conditional_group)
.or(any_of_group)
.or(all_of_group)
@@ -68,13 +70,15 @@ mod test {
use mon::input::InputIter;
+ use crate::atom::Atom;
+
use super::*;
#[test]
fn test_expr() {
let it = InputIter::new("flag? ( || ( foo/bar foo/bar ) )");
- Expr::parser()
+ Expr::<Atom>::parser()
.separated_list(whitespace1(), 0..)
.check_finished(it)
.unwrap();
diff --git a/tests/depend.rs b/tests/depend.rs
index 12d6e75..02c59f2 100644
--- a/tests/depend.rs
+++ b/tests/depend.rs
@@ -1,5 +1,6 @@
use gentoo_utils::{
Parseable,
+ atom::Atom,
depend::{self, Expr},
};
use mon::{Parser, eof, input::InputIter, tag, whitespace1};
@@ -17,7 +18,7 @@ fn parse_md5_cache() {
if line.starts_with("DEPEND=") {
eprintln!("{line}");
eprintln!();
- Expr::parser()
+ Expr::<Atom>::parser()
.separated_list(whitespace1(), 0..)
.ignore()
.or(eof())