diff --git a/src/atom/mod.rs b/src/atom/mod.rs index 6688665..11ca246 100644 --- a/src/atom/mod.rs +++ b/src/atom/mod.rs @@ -119,6 +119,7 @@ pub struct Cpv { category: Category, name: Name, version: Version, + slot: Option, } #[derive(Clone, Debug, Get, PartialEq, Eq)] @@ -572,7 +573,13 @@ impl fmt::Display for Cp { impl fmt::Display for Cpv { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}/{}-{}", &self.category, &self.name, &self.version) + write!(f, "{}/{}-{}", &self.category, &self.name, &self.version)?; + + if let Some(slot) = self.slot.as_ref() { + write!(f, ":{slot}")?; + } + + Ok(()) } } diff --git a/src/atom/parsers.rs b/src/atom/parsers.rs index 4806857..37e18a7 100644 --- a/src/atom/parsers.rs +++ b/src/atom/parsers.rs @@ -351,10 +351,12 @@ impl<'a> Parseable<'a, &'a str> for Cpv { Category::parser() .and(Name::parser().preceded_by(tag("/"))) .and(Version::parser().preceded_by(tag("-"))) - .map(|((category, name), version)| Cpv { + .and(Slot::parser().preceded_by(tag(":")).opt()) + .map(|(((category, name), version), slot)| Cpv { category, name, version, + slot, }) } } @@ -479,4 +481,11 @@ mod test { Atom::parser().check_finished(it).unwrap(); } + + #[test] + fn test_cpv_with_slot() { + let it = InputIter::new("foo/bar-1.0:slot/sub="); + + Cpv::parser().check_finished(it).unwrap(); + } }