From fcf973c16d4128dda76b809b0d5b9a2635afae47 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Wed, 24 Apr 2019 09:56:27 +0200 Subject: Add missing "ComparePackage" type Because we cannot build a "Package" from the compare file (because we shouldn't, because we only need _some_ information about the package), we should use a special helper type for deserializing the contents of the file. --- src/compare.rs | 15 +++++++++++++++ src/frontend/json.rs | 7 ++++--- src/frontend/list.rs | 3 ++- src/frontend/mod.rs | 3 ++- src/frontend/table.rs | 3 ++- src/main.rs | 9 +++++---- 6 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 src/compare.rs diff --git a/src/compare.rs b/src/compare.rs new file mode 100644 index 0000000..c13d01e --- /dev/null +++ b/src/compare.rs @@ -0,0 +1,15 @@ +#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] +pub struct ComparePackage { + name: String, + version: String, +} + +impl ComparePackage { + pub fn name(&self) -> &String { + &self.name + } + + pub fn version(&self) -> &String { + &self.version + } +} \ No newline at end of file diff --git a/src/frontend/json.rs b/src/frontend/json.rs index 63b7bbe..b6a34e5 100644 --- a/src/frontend/json.rs +++ b/src/frontend/json.rs @@ -10,6 +10,7 @@ use failure::Error; use crate::frontend::Frontend; use crate::backend::Backend; +use crate::compare::ComparePackage; use librepology::v1::api::Api; pub struct JsonFrontend(Stdout); @@ -33,7 +34,7 @@ impl Frontend for JsonFrontend { writeln!(outlock, "{}", output).map_err(Error::from) } - fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()> { + 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 @@ -53,8 +54,8 @@ impl Frontend for JsonFrontend { .filter(|p| filter_repos.contains(p.repo())) .map(|upstream_package| { PackageComp { - package_name: package.name().deref().clone(), - local_version: package.version().deref().clone(), + package_name: package.name().clone(), + local_version: package.version().clone(), upstream_repo: upstream_package.repo().deref().clone(), upstream_version: upstream_package.version().deref().clone(), } diff --git a/src/frontend/list.rs b/src/frontend/list.rs index b229ecd..e870ab0 100644 --- a/src/frontend/list.rs +++ b/src/frontend/list.rs @@ -10,6 +10,7 @@ use failure::Error; use crate::frontend::Frontend; use crate::backend::Backend; +use crate::compare::ComparePackage; use librepology::v1::api::Api; pub struct ListFrontend(Stdout); @@ -71,7 +72,7 @@ impl Frontend for ListFrontend { }) } - fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()> { + fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()> { let mut output = self.0.lock(); for package in packages { diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs index 0027fd8..43e5b5e 100644 --- a/src/frontend/mod.rs +++ b/src/frontend/mod.rs @@ -7,12 +7,13 @@ use crate::config::Configuration; use crate::frontend::list::ListFrontend; use crate::frontend::json::JsonFrontend; use crate::frontend::table::TableFrontend; +use crate::compare::ComparePackage; use crate::backend::Backend; pub trait Frontend { fn list_packages(&self, packages: Vec) -> Result<()>; fn list_problems(&self, problems: Vec) -> Result<()>; - fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()>; + fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()>; } pub mod list; diff --git a/src/frontend/table.rs b/src/frontend/table.rs index f840482..6a30e9c 100644 --- a/src/frontend/table.rs +++ b/src/frontend/table.rs @@ -10,6 +10,7 @@ use prettytable::Table; use crate::frontend::Frontend; use crate::backend::Backend; +use crate::compare::ComparePackage; use librepology::v1::api::Api; pub struct TableFrontend(Stdout); @@ -94,7 +95,7 @@ impl Frontend for TableFrontend { Ok(()) } - fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()> { + fn compare_packages(&self, packages: Vec, backend: &Backend, filter_repos: Vec) -> Result<()> { let mut table = Table::new(); let format = format::FormatBuilder::new() .column_separator('|') diff --git a/src/main.rs b/src/main.rs index 62e193d..9acc496 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,7 @@ mod config; mod backend; mod frontend; mod cli; +mod compare; use std::path::PathBuf; @@ -34,9 +35,9 @@ use clap::ArgMatches; use filters::filter::Filter; use config::Configuration; +use compare::ComparePackage; use librepology::v1::api::Api; use librepology::v1::types::Repo; -use librepology::v1::types::Package; fn initialize_logging(app: &ArgMatches) -> Result<()> { let verbosity = app.occurrences_of("verbose"); @@ -65,7 +66,7 @@ fn initialize_logging(app: &ArgMatches) -> Result<()> { .map_err(Error::from) } -fn deserialize_package_list(s: String, filepath: &str) -> Result> { +fn deserialize_package_list(s: String, filepath: &str) -> Result> { let pb = PathBuf::from(filepath); let ext = pb .extension() @@ -81,7 +82,7 @@ fn deserialize_package_list(s: String, filepath: &str) -> Result> { #[cfg(feature = "compare_csv")] "csv" => { let cursor = Cursor::new(s); - let mut v : Vec = vec![]; + let mut v : Vec = vec![]; for element in csv::Reader::from_reader(cursor).deserialize() { v.push(element?); } @@ -185,7 +186,7 @@ fn main() -> Result<()> { let repos = mtch.values_of("compare-distros").unwrap().map(|s| Repo::new(String::from(s))).collect(); let file_path = mtch.value_of("compare-list").unwrap(); // safe by clap let content = ::std::fs::read_to_string(file_path).map_err(Error::from)?; - let pkgs : Vec = deserialize_package_list(content, file_path)?; + let pkgs : Vec = deserialize_package_list(content, file_path)?; frontend.compare_packages(pkgs, &backend, repos)?; }, -- cgit v1.2.3