//! Gentoo and PMS related utils. //! //! Currently implements: //! - parsers for atoms and DEPEND expressions //! - strongly typed representations of atoms, versions, etc //! - version comparison and equality impls //! - iterator over repos categories and ebuilds //! //! Planned features //! - profile evaluation //! - vdb reader //! - sourcing ebuilds with bash //! #![deny(clippy::pedantic, unused_imports)] #![allow( dead_code, unstable_name_collisions, clippy::missing_errors_doc, clippy::missing_panics_doc )] #![feature(impl_trait_in_assoc_type)] use mon::{ Parser, input::{Input, InputIter}, }; pub trait Parseable<'a, I: Input + 'a> { type Parser: Parser; fn parser() -> Self::Parser; fn parse(input: I) -> Result where Self: Sized, { Self::parser() .parse_finished(InputIter::new(input)) .map_err(|e| e.rest()) } } /// Strongly typed atom and cpv representations. /// /// Create atoms from parsers: /// ``` /// use gentoo_utils::{Parseable, atom::Atom}; /// /// let emacs = Atom::parse("=app-editors/emacs-31.0-r1") /// .expect("failed to parse atom"); /// /// assert_eq!(emacs.to_string(), "=app-editors/emacs-31.0-r1"); /// ```` /// /// Compare versions: /// ``` /// use gentoo_utils::{Parseable, atom::Cpv}; /// /// let a = Cpv::parse("foo/bar-1.0").unwrap(); /// let b = Cpv::parse("foo/bar-2.0").unwrap(); /// /// assert!(a < b); /// ``` pub mod atom; /// Access to repos and ebuilds. /// /// ``` /// use gentoo_utils::repo::Repo; /// /// let repo = Repo::new("/var/db/repos/gentoo"); /// /// for result in repo.categories().expect("failed to read categories") { /// let category = result.expect("failed to read category"); /// /// for result in category.ebuilds().expect("failed to read ebuilds") { /// let ebuild = result.expect("failed to read ebuild"); /// /// println!( /// "{}-{}: {}", /// ebuild.name(), /// ebuild.version(), /// ebuild.description().clone().unwrap_or("no description available".to_string()) /// ); /// } /// } /// /// ``` pub mod repo; pub mod useflag;