diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-10-30 11:29:15 +0100 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-10-30 11:29:15 +0100 |
commit | df1ae0eec0742c3d5e882738f96c665882448437 (patch) | |
tree | a99d829ab39af5037f0318a9cdd31c35823d46dd /src/package/dependency | |
parent | 25508b353a4f0a277d9f4ef2f67f5b1b710708c9 (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.rs | 11 | ||||
-rw-r--r-- | src/package/dependency/mod.rs | 38 | ||||
-rw-r--r-- | src/package/dependency/runtime.rs | 29 | ||||
-rw-r--r-- | src/package/dependency/system.rs | 10 | ||||
-rw-r--r-- | src/package/dependency/system_runtime.rs | 10 |
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) + } +} + |