summaryrefslogtreecommitdiffstats
path: root/src/filestore
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-10-28 13:17:46 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-10-28 13:49:52 +0100
commit09113dcf7a4cf6124c2f88178558062b99c77863 (patch)
tree7eff7c6dec27a6ec7ddc994fcc571a8926b07508 /src/filestore
parent53a77eb46b4152def2d0e4518151353f80656eee (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.rs27
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> {