summaryrefslogtreecommitdiffstats
path: root/src/package/dependency
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2020-10-30 11:29:15 +0100
committerMatthias Beyer <mail@beyermatthias.de>2020-10-30 11:29:15 +0100
commitdf1ae0eec0742c3d5e882738f96c665882448437 (patch)
treea99d829ab39af5037f0318a9cdd31c35823d46dd /src/package/dependency
parent25508b353a4f0a277d9f4ef2f67f5b1b710708c9 (diff)
Add ParseDependency trait
This patch adds a trait "ParseDependency" which can be used to transform a stringly typed dependency object into a (PackageName, PackageVersion). Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'src/package/dependency')
-rw-r--r--src/package/dependency/build.rs11
-rw-r--r--src/package/dependency/mod.rs38
-rw-r--r--src/package/dependency/runtime.rs29
-rw-r--r--src/package/dependency/system.rs10
-rw-r--r--src/package/dependency/system_runtime.rs10
5 files changed, 74 insertions, 24 deletions
diff --git a/src/package/dependency/build.rs b/src/package/dependency/build.rs
index 0f8c0c1..9d67051 100644
--- a/src/package/dependency/build.rs
+++ b/src/package/dependency/build.rs
@@ -1,6 +1,10 @@
use serde::Deserialize;
+use anyhow::Result;
use crate::package::dependency::StringEqual;
+use crate::package::dependency::ParseDependency;
+use crate::package::PackageName;
+use crate::package::PackageVersionConstraint;
/// A dependency that is packaged and is only required during build time
#[derive(Deserialize, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
@@ -12,3 +16,10 @@ impl StringEqual for BuildDependency {
self.0 == s
}
}
+
+impl ParseDependency for BuildDependency {
+ fn parse_into_name_and_version(self) -> Result<(PackageName, PackageVersionConstraint)> {
+ crate::package::dependency::parse_package_dependency_string_into_name_and_version(&self.0)
+ }
+}
+
diff --git a/src/package/dependency/mod.rs b/src/package/dependency/mod.rs
index f2f0b8a..6df8b6a 100644
--- a/src/package/dependency/mod.rs
+++ b/src/package/dependency/mod.rs
@@ -1,3 +1,11 @@
+use lazy_static::lazy_static;
+use anyhow::anyhow;
+use anyhow::Result;
+use regex::Regex;
+
+use crate::package::PackageName;
+use crate::package::PackageVersionConstraint;
+
mod system;
pub use system::*;
@@ -14,6 +22,36 @@ pub trait StringEqual {
fn str_equal(&self, s: &str) -> bool;
}
+pub trait ParseDependency {
+ fn parse_into_name_and_version(self) -> Result<(PackageName, PackageVersionConstraint)>;
+}
+
+lazy_static! {
+ pub(in crate::package::dependency) static ref DEPENDENCY_PARSING_RE: Regex =
+ Regex::new("^(?P<name>[[:alpha:]]([[[:alnum:]]-_])*) (?P<version>([\\*=><])?[[:alnum:]]([[[:alnum:]][[:punct:]]])*)$").unwrap();
+}
+
+/// Helper function for the actual implementation of the ParseDependency trait.
+///
+/// TODO: Reimplement using pom crate
+pub(in crate::package::dependency) fn parse_package_dependency_string_into_name_and_version(s: &str)
+ -> Result<(PackageName, PackageVersionConstraint)>
+{
+ let caps = crate::package::dependency::DEPENDENCY_PARSING_RE
+ .captures(s)
+ .ok_or_else(|| anyhow!("Could not parse into package name and package version constraint: '{}'", s))?;
+
+ let name = caps.name("name")
+ .ok_or_else(|| anyhow!("Could not parse name: '{}'", s))?;
+
+ let vers = caps.name("version")
+ .ok_or_else(|| anyhow!("Could not parse version: '{}'", s))?;
+
+ let constraint = PackageVersionConstraint::parse(vers.as_str())?;
+
+ Ok((PackageName::from(String::from(name.as_str())), constraint))
+}
+
#[cfg(test)]
mod tests {
use super::*;
diff --git a/src/package/dependency/runtime.rs b/src/package/dependency/runtime.rs
index 5096469..de445b3 100644
--- a/src/package/dependency/runtime.rs
+++ b/src/package/dependency/runtime.rs
@@ -1,12 +1,10 @@
-use std::result::Result as RResult;
use serde::Deserialize;
-use regex::Regex;
-use lazy_static::lazy_static;
-use anyhow::anyhow;
+use anyhow::Result;
use crate::package::PackageName;
use crate::package::PackageVersionConstraint;
use crate::package::dependency::StringEqual;
+use crate::package::dependency::ParseDependency;
/// A dependency that is packaged and is required during runtime
@@ -26,26 +24,9 @@ impl From<String> for Dependency {
}
}
-impl std::convert::TryInto<(PackageName, PackageVersionConstraint)> for Dependency {
- type Error = anyhow::Error;
-
- fn try_into(self) -> RResult<(PackageName, PackageVersionConstraint), Self::Error> {
- lazy_static! {
- static ref RE: Regex = Regex::new("^(?P<name>[[:alpha:]]([[[:alnum:]]-_])*) (?P<version>([\\*=><])?[[:alnum:]]([[[:alnum:]][[:punct:]]])*)$").unwrap();
- }
-
- let caps = RE.captures(&self.0)
- .ok_or_else(|| anyhow!("Could not parse into package name and package version constraint: '{}'", self.0))?;
-
- let name = caps.name("name")
- .ok_or_else(|| anyhow!("Could not parse name: '{}'", self.0))?;
-
- let vers = caps.name("version")
- .ok_or_else(|| anyhow!("Could not parse version: '{}'", self.0))?;
-
- let constraint = PackageVersionConstraint::parse(vers.as_str())?;
-
- Ok((PackageName::from(String::from(name.as_str())), constraint))
+impl ParseDependency for Dependency {
+ fn parse_into_name_and_version(self) -> Result<(PackageName, PackageVersionConstraint)> {
+ crate::package::dependency::parse_package_dependency_string_into_name_and_version(&self.0)
}
}
diff --git a/src/package/dependency/system.rs b/src/package/dependency/system.rs
index aa5241c..9e731f7 100644
--- a/src/package/dependency/system.rs
+++ b/src/package/dependency/system.rs
@@ -1,6 +1,10 @@
use serde::Deserialize;
+use anyhow::Result;
use crate::package::dependency::StringEqual;
+use crate::package::dependency::ParseDependency;
+use crate::package::PackageName;
+use crate::package::PackageVersionConstraint;
/// A dependency that can be installed from the system and is only required during build
#[derive(Deserialize, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
@@ -13,3 +17,9 @@ impl StringEqual for SystemBuildDependency {
}
}
+impl ParseDependency for SystemBuildDependency {
+ fn parse_into_name_and_version(self) -> Result<(PackageName, PackageVersionConstraint)> {
+ crate::package::dependency::parse_package_dependency_string_into_name_and_version(&self.0)
+ }
+}
+
diff --git a/src/package/dependency/system_runtime.rs b/src/package/dependency/system_runtime.rs
index 1764102..75942d0 100644
--- a/src/package/dependency/system_runtime.rs
+++ b/src/package/dependency/system_runtime.rs
@@ -1,6 +1,10 @@
use serde::Deserialize;
+use anyhow::Result;
use crate::package::dependency::StringEqual;
+use crate::package::dependency::ParseDependency;
+use crate::package::PackageName;
+use crate::package::PackageVersionConstraint;
/// A dependency that can be installed from the system and is required during runtime
#[derive(Deserialize, Clone, Debug, Hash, Eq, PartialEq, Ord, PartialOrd)]
@@ -13,3 +17,9 @@ impl StringEqual for SystemDependency {
}
}
+impl ParseDependency for SystemDependency {
+ fn parse_into_name_and_version(self) -> Result<(PackageName, PackageVersionConstraint)> {
+ crate::package::dependency::parse_package_dependency_string_into_name_and_version(&self.0)
+ }
+}
+