diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-10-28 13:17:46 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-10-28 13:49:52 +0100 |
commit | 09113dcf7a4cf6124c2f88178558062b99c77863 (patch) | |
tree | 7eff7c6dec27a6ec7ddc994fcc571a8926b07508 /src/filestore | |
parent | 53a77eb46b4152def2d0e4518151353f80656eee (diff) |
Split parser implementation
This commit splits the parser implementation and moves the code to the
types it parses.
This way we reduce the code duplication.
A util module was added for the trivial parser functions.
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/filestore')
-rw-r--r-- | src/filestore/artifact.rs | 27 |
1 files changed, 2 insertions, 25 deletions
diff --git a/src/filestore/artifact.rs b/src/filestore/artifact.rs index e503fad..2e57816 100644 --- a/src/filestore/artifact.rs +++ b/src/filestore/artifact.rs @@ -45,31 +45,8 @@ impl Artifact { /// Construct a parser that parses a Vec<u8> into (PackageName, PackageVersion) fn parser<'a>() -> PomParser<'a, u8, (PackageName, PackageVersion)> { - use pom::parser::*; - use pom::char_class::hex_digit; - - let numbers = || one_of(b"0123456789").repeat(1..); - let letters = || pom::parser::is_a(pom::char_class::alpha).repeat(1..); - let dash = || sym(b'-').map(|b| vec![b]); - let under = || sym(b'_').map(|b| vec![b]); - let dot = || sym(b'.').map(|b| vec![b]); - - let package_name = (letters() + ((letters() | numbers()).repeat(0..))) - .collect() - .convert(|b| String::from_utf8(b.to_vec())); - - let package_version = ( - numbers() + - ((dash() | under() | dot() | letters() | numbers()).repeat(0..)) - ) - .collect() - .convert(|b| String::from_utf8(b.to_vec())); - - (package_name + dash() + package_version) - .map(|((name, _), version)| (name, version)) - .map(|(name, version)| { - (PackageName::from(name), PackageVersion::from(version)) - }) + (PackageName::parser() + crate::util::parser::dash() + PackageVersion::parser()) + .map(|((name, _), vers)| (name, vers)) } pub fn create(root: &Path, name: PackageName, version: PackageVersion) -> Result<Self> { |