92 lines
2.1 KiB
Rust
92 lines
2.1 KiB
Rust
//! 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<I, Output = Self>;
|
|
|
|
fn parser() -> Self::Parser;
|
|
|
|
fn parse(input: I) -> Result<Self, I>
|
|
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;
|