summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <matthias.beyer@atos.net>2019-04-23 13:25:03 +0200
committerMatthias Beyer <matthias.beyer@atos.net>2019-04-23 15:52:00 +0200
commit44215217da63762b36827f5ef6604c5a2ad6b73d (patch)
treebfb48cc4bca7284e4ecffa92d0aa74e963ff38a0
parent95e4800ddf616649c93811678cdd2016a3ebb786 (diff)
Add filters for Repo, Name, Status, Version, License and Maintainer
-rw-r--r--librepology/Cargo.toml9
-rw-r--r--librepology/src/lib.rs8
-rw-r--r--librepology/src/packagefilters.rs81
-rw-r--r--librepology/src/v1/types.rs2
4 files changed, 99 insertions, 1 deletions
diff --git a/librepology/Cargo.toml b/librepology/Cargo.toml
index 7379b10..5f7bb52 100644
--- a/librepology/Cargo.toml
+++ b/librepology/Cargo.toml
@@ -15,3 +15,12 @@ failure = "0.1"
log = "0.4"
derive_more = "0.14"
curl = "0.4"
+
+filters = { version = "0.3", optional = true }
+derive-new = { version = "0.5", optional = true }
+
+[features]
+# By default, we include the filters functionality
+default = [ "packagefilters" ]
+
+packagefilters = ["filters", "derive-new"] \ No newline at end of file
diff --git a/librepology/src/lib.rs b/librepology/src/lib.rs
index d7192f2..76992fd 100644
--- a/librepology/src/lib.rs
+++ b/librepology/src/lib.rs
@@ -5,8 +5,16 @@ extern crate url;
extern crate url_serde;
extern crate curl;
+#[cfg(feature = "packagefilters")]
+extern crate filters;
+#[cfg(feature = "packagefilters")]
+#[macro_use] extern crate derive_new;
+
#[macro_use] extern crate serde_derive;
#[macro_use] extern crate log;
#[macro_use] extern crate derive_more;
pub mod v1;
+
+#[cfg(feature = "packagefilters")]
+pub mod packagefilters;
diff --git a/librepology/src/packagefilters.rs b/librepology/src/packagefilters.rs
new file mode 100644
index 0000000..d1293d4
--- /dev/null
+++ b/librepology/src/packagefilters.rs
@@ -0,0 +1,81 @@
+use filters::filter::Filter;
+
+use crate::v1::types::{Package, Repo, Name, Status, Version, License, Maintainer};
+
+
+#[derive(new, Debug)]
+pub struct PackageRepoNameFilter(Repo);
+
+/// Filter implementation for PackageRepoNameFilter
+///
+/// filters based on _equality_!
+impl Filter<Package> for PackageRepoNameFilter {
+ fn filter(&self, package: &Package) -> bool {
+ self.0 == *package.repo()
+ }
+}
+
+
+#[derive(new, Debug)]
+pub struct PackageNameFilter(Name);
+
+/// Filter implementation for PackageNameFilter
+///
+/// filters based on _equality_!
+impl Filter<Package> for PackageNameFilter {
+ fn filter(&self, package: &Package) -> bool {
+ self.0 == *package.name()
+ }
+}
+
+
+#[derive(new, Debug)]
+pub struct PackageVersionFilter(Version);
+
+/// Filter implementation for PackageVersionFilter
+///
+/// filters based on _equality_!
+impl Filter<Package> for PackageVersionFilter {
+ fn filter(&self, package: &Package) -> bool {
+ self.0 == *package.version()
+ }
+}
+
+
+#[derive(new, Debug)]
+pub struct PackageStatusFilter(Status);
+
+/// Filter implementation for PackageStatusFilter
+///
+/// filters based on _equality_!
+impl Filter<Package> for PackageStatusFilter {
+ fn filter(&self, package: &Package) -> bool {
+ package.status().map(|s| self.0 == *s).unwrap_or(false)
+ }
+}
+
+
+#[derive(new, Debug)]
+pub struct PackageLicenseFilter(License);
+
+/// Filter implementation for PackageLicenseFilter
+///
+/// filters based on _equality_!
+impl Filter<Package> for PackageLicenseFilter {
+ fn filter(&self, package: &Package) -> bool {
+ package.licenses().map(|lcs| lcs.iter().any(|l| self.0 == *l)).unwrap_or(false)
+ }
+}
+
+
+#[derive(new, Debug)]
+pub struct PackageMaintainerFilter(Maintainer);
+
+/// Filter implementation for PackageMaintainerFilter
+///
+/// filters based on _equality_!
+impl Filter<Package> for PackageMaintainerFilter {
+ fn filter(&self, package: &Package) -> bool {
+ package.maintainers().map(|mts| mts.iter().any(|m| self.0 == *m)).unwrap_or(false)
+ }
+}
diff --git a/librepology/src/v1/types.rs b/librepology/src/v1/types.rs
index 3f79c03..bd47471 100644
--- a/librepology/src/v1/types.rs
+++ b/librepology/src/v1/types.rs
@@ -2,7 +2,7 @@ use std::ops::Deref;
use url::Url;
-#[derive(Eq, PartialEq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)]
+#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Package {
/// name of repository for this package
repo: Repo,