forked from gentoo-utils/gentoo-utils
add parse method to Parseable trait for easy parsing
This commit is contained in:
29
src/lib.rs
29
src/lib.rs
@@ -21,12 +21,24 @@
|
|||||||
)]
|
)]
|
||||||
#![feature(impl_trait_in_assoc_type)]
|
#![feature(impl_trait_in_assoc_type)]
|
||||||
|
|
||||||
use mon::{Parser, input::Input};
|
use mon::{
|
||||||
|
Parser,
|
||||||
|
input::{Input, InputIter},
|
||||||
|
};
|
||||||
|
|
||||||
pub trait Parseable<'a, I: Input + 'a> {
|
pub trait Parseable<'a, I: Input + 'a> {
|
||||||
type Parser: Parser<I, Output = Self>;
|
type Parser: Parser<I, Output = Self>;
|
||||||
|
|
||||||
fn parser() -> Self::Parser;
|
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.
|
/// Strongly typed atom and cpv representations.
|
||||||
@@ -34,10 +46,9 @@ pub trait Parseable<'a, I: Input + 'a> {
|
|||||||
/// Create atoms from parsers:
|
/// Create atoms from parsers:
|
||||||
/// ```
|
/// ```
|
||||||
/// use gentoo_utils::{Parseable, atom::Atom};
|
/// use gentoo_utils::{Parseable, atom::Atom};
|
||||||
/// use mon::{Parser, input::InputIter};
|
|
||||||
///
|
///
|
||||||
/// let it = InputIter::new("=app-editors/emacs-31.0-r1");
|
/// let emacs = Atom::parse("=app-editors/emacs-31.0-r1")
|
||||||
/// let emacs = Atom::parser().parse_finished(it).unwrap();
|
/// .expect("failed to parse atom");
|
||||||
///
|
///
|
||||||
/// assert_eq!(emacs.to_string(), "=app-editors/emacs-31.0-r1");
|
/// assert_eq!(emacs.to_string(), "=app-editors/emacs-31.0-r1");
|
||||||
/// ````
|
/// ````
|
||||||
@@ -45,15 +56,9 @@ pub trait Parseable<'a, I: Input + 'a> {
|
|||||||
/// Compare versions:
|
/// Compare versions:
|
||||||
/// ```
|
/// ```
|
||||||
/// use gentoo_utils::{Parseable, atom::Cpv};
|
/// use gentoo_utils::{Parseable, atom::Cpv};
|
||||||
/// use mon::{Parser, input::InputIter};
|
|
||||||
///
|
///
|
||||||
/// let a = Cpv::parser()
|
/// let a = Cpv::parse("foo/bar-1.0").unwrap();
|
||||||
/// .parse_finished(InputIter::new("foo/bar-1.0"))
|
/// let b = Cpv::parse("foo/bar-2.0").unwrap();
|
||||||
/// .unwrap();
|
|
||||||
///
|
|
||||||
/// let b = Cpv::parser()
|
|
||||||
/// .parse_finished(InputIter::new("foo/bar-2.0"))
|
|
||||||
/// .unwrap();
|
|
||||||
///
|
///
|
||||||
/// assert!(a < b);
|
/// assert!(a < b);
|
||||||
/// ```
|
/// ```
|
||||||
|
|||||||
Reference in New Issue
Block a user