From 810ea6e400c9f52530ca089c24d1a93c035c182e Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Wed, 24 Apr 2019 09:45:47 +0200 Subject: Implement JsonFrontend::compare_packages() --- src/frontend/json.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/frontend/json.rs b/src/frontend/json.rs index 9cf5573..63b7bbe 100644 --- a/src/frontend/json.rs +++ b/src/frontend/json.rs @@ -4,10 +4,13 @@ use std::ops::Deref; use librepology::v1::types::Package; use librepology::v1::types::Problem; +use librepology::v1::types::Repo; use failure::Fallible as Result; use failure::Error; use crate::frontend::Frontend; +use crate::backend::Backend; +use librepology::v1::api::Api; pub struct JsonFrontend(Stdout); @@ -29,5 +32,42 @@ impl Frontend for JsonFrontend { let mut outlock = self.0.lock(); writeln!(outlock, "{}", output).map_err(Error::from) } + + fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()> { + #[derive(Serialize)] + struct PackageComp { + // not optimal, as we have to clone the inner variables from the package + // but using references is too complicated right now + package_name: String, + local_version: String, + upstream_repo: String, + upstream_version: String, + } + + let mut output: Vec = vec![]; + + for package in packages.iter() { + let mut list = backend + .project(package.name().deref())? + .into_iter() + .filter(|p| filter_repos.contains(p.repo())) + .map(|upstream_package| { + PackageComp { + package_name: package.name().deref().clone(), + local_version: package.version().deref().clone(), + upstream_repo: upstream_package.repo().deref().clone(), + upstream_version: upstream_package.version().deref().clone(), + } + }) + .collect::>(); + + output.append(&mut list); + } + + let output = serde_json::ser::to_string_pretty(&output)?; + + let mut outlock = self.0.lock(); + writeln!(outlock, "{}", output).map_err(Error::from) + } } -- cgit v1.2.3