summaryrefslogtreecommitdiffstats
path: root/src/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend')
-rw-r--r--src/frontend/json.rs12
-rw-r--r--src/frontend/list.rs56
-rw-r--r--src/frontend/mod.rs22
-rw-r--r--src/frontend/table.rs31
4 files changed, 75 insertions, 46 deletions
diff --git a/src/frontend/json.rs b/src/frontend/json.rs
index 6ef5e0c..42e44d1 100644
--- a/src/frontend/json.rs
+++ b/src/frontend/json.rs
@@ -8,9 +8,9 @@ use librepology::v1::types::Package;
use librepology::v1::types::Problem;
use librepology::v1::types::Repo;
-use crate::frontend::Frontend;
use crate::backend::Backend;
use crate::compare::ComparePackage;
+use crate::frontend::Frontend;
use librepology::v1::api::Api;
pub struct JsonFrontend(Stdout);
@@ -38,14 +38,18 @@ impl JsonFrontend {
impl Frontend for JsonFrontend {
fn list_packages(&self, packages: Vec<Package>) -> Result<()> {
self.write(serde_json::ser::to_string_pretty(&packages).map_err(Error::from)?)
-
}
fn list_problems(&self, problems: Vec<Problem>) -> Result<()> {
self.write(serde_json::ser::to_string_pretty(&problems).map_err(Error::from)?)
}
- fn compare_packages(&self, packages: Vec<ComparePackage>, backend: &Backend, filter_repos: Vec<Repo>) -> Result<()> {
+ fn compare_packages(
+ &self,
+ packages: Vec<ComparePackage>,
+ backend: &Backend,
+ filter_repos: Vec<Repo>,
+ ) -> Result<()> {
#[derive(Serialize)]
struct PackageComp {
// not optimal, as we have to clone the inner variables from the package
@@ -64,7 +68,6 @@ impl Frontend for JsonFrontend {
let mut output: Vec<PackageComp> = vec![];
for package in packages.iter() {
-
let comparisons = backend
.project(package.name().deref())?
.into_iter()
@@ -85,4 +88,3 @@ impl Frontend for JsonFrontend {
self.write(serde_json::ser::to_string_pretty(&output)?)
}
}
-
diff --git a/src/frontend/list.rs b/src/frontend/list.rs
index 61aa670..469d6ec 100644
--- a/src/frontend/list.rs
+++ b/src/frontend/list.rs
@@ -9,9 +9,9 @@ use librepology::v1::types::Package;
use librepology::v1::types::Problem;
use librepology::v1::types::Repo;
-use crate::frontend::Frontend;
use crate::backend::Backend;
use crate::compare::ComparePackage;
+use crate::frontend::Frontend;
use librepology::v1::api::Api;
pub struct ListFrontend(Stdout);
@@ -31,13 +31,13 @@ impl Frontend for ListFrontend {
packages.iter().fold(Ok(()), |accu, package| {
accu.and_then(|_| {
- let status= if let Some(stat) = package.status() {
+ let status = if let Some(stat) = package.status() {
stat.deref().to_string()
} else {
String::from("No status")
}; // not optimal, but works for now.
- let url= if let Some(url) = package.www() {
+ let url = if let Some(url) = package.www() {
if let Some(url) = url.first() {
url.deref().to_string()
} else {
@@ -47,13 +47,21 @@ impl Frontend for ListFrontend {
String::from("")
}; // not optimal, but works for now
- writeln!(outlock,
- "{name:10} - {version:8} - {repo:15} - {status:5} - {www}",
- name = package.any_name().map(Name::deref).map(String::deref).unwrap_or_else(|| "<unknown>"),
- version = package.version().deref(),
- repo = package.repo().deref(),
- status = status,
- www = url).map(|_| ()).map_err(Error::from)
+ writeln!(
+ outlock,
+ "{name:10} - {version:8} - {repo:15} - {status:5} - {www}",
+ name = package
+ .any_name()
+ .map(Name::deref)
+ .map(String::deref)
+ .unwrap_or_else(|| "<unknown>"),
+ version = package.version().deref(),
+ repo = package.repo().deref(),
+ status = status,
+ www = url
+ )
+ .map(|_| ())
+ .map_err(Error::from)
})
})
}
@@ -63,20 +71,27 @@ impl Frontend for ListFrontend {
problems.iter().fold(Ok(()), |accu, problem| {
accu.and_then(|_| {
- writeln!(outlock,
- "{repo:10} - {name:10} - {effname:10} - {maintainer:15} - {desc}",
- repo = problem.repo().deref(),
- name = problem.name().deref(),
- effname = problem.effname().deref(),
- maintainer = problem.maintainer().deref(),
- desc = problem.problem_description())
- .map(|_| ())
- .map_err(Error::from)
+ writeln!(
+ outlock,
+ "{repo:10} - {name:10} - {effname:10} - {maintainer:15} - {desc}",
+ repo = problem.repo().deref(),
+ name = problem.name().deref(),
+ effname = problem.effname().deref(),
+ maintainer = problem.maintainer().deref(),
+ desc = problem.problem_description()
+ )
+ .map(|_| ())
+ .map_err(Error::from)
})
})
}
- fn compare_packages(&self, packages: Vec<ComparePackage>, backend: &Backend, filter_repos: Vec<Repo>) -> Result<()> {
+ fn compare_packages(
+ &self,
+ packages: Vec<ComparePackage>,
+ backend: &Backend,
+ filter_repos: Vec<Repo>,
+ ) -> Result<()> {
let mut output = self.0.lock();
for package in packages {
@@ -99,4 +114,3 @@ impl Frontend for ListFrontend {
Ok(())
}
}
-
diff --git a/src/frontend/mod.rs b/src/frontend/mod.rs
index e2dda0e..c9ef381 100644
--- a/src/frontend/mod.rs
+++ b/src/frontend/mod.rs
@@ -3,22 +3,27 @@ use clap::ArgMatches;
use librepology::v1::types::*;
+use crate::backend::Backend;
+use crate::compare::ComparePackage;
use crate::config::Configuration;
-use crate::frontend::list::ListFrontend;
use crate::frontend::json::JsonFrontend;
+use crate::frontend::list::ListFrontend;
use crate::frontend::table::TableFrontend;
-use crate::compare::ComparePackage;
-use crate::backend::Backend;
/// A Frontend represents a way to show the data to the user
pub trait Frontend {
fn list_packages(&self, packages: Vec<Package>) -> Result<()>;
fn list_problems(&self, problems: Vec<Problem>) -> Result<()>;
- fn compare_packages(&self, packages: Vec<ComparePackage>, backend: &Backend, filter_repos: Vec<Repo>) -> Result<()>;
+ fn compare_packages(
+ &self,
+ packages: Vec<ComparePackage>,
+ backend: &Backend,
+ filter_repos: Vec<Repo>,
+ ) -> Result<()>;
}
-pub mod list;
pub mod json;
+pub mod list;
pub mod table;
/// Helper function for building a new Frontend object based on the commandline parameters
@@ -27,19 +32,18 @@ pub fn new_frontend(app: &ArgMatches, _config: &Configuration) -> Result<Box<dyn
None | Some("lines") => {
debug!("No output specified, using default");
Ok(Box::new(ListFrontend::new(::std::io::stdout())))
- },
+ }
Some("json") => {
debug!("Using JSON Frontend");
Ok(Box::new(JsonFrontend::new(::std::io::stdout())))
- },
+ }
Some("table") => {
debug!("Using table Frontend");
Ok(Box::new(TableFrontend::new(::std::io::stdout())))
- },
+ }
Some(other) => Err(format_err!("Unknown Frontend '{}'", other)),
}
-
}
diff --git a/src/frontend/table.rs b/src/frontend/table.rs
index 12452a8..6bb42d2 100644
--- a/src/frontend/table.rs
+++ b/src/frontend/table.rs
@@ -9,9 +9,9 @@ use librepology::v1::types::Repo;
use prettytable::format;
use prettytable::Table;
-use crate::frontend::Frontend;
use crate::backend::Backend;
use crate::compare::ComparePackage;
+use crate::frontend::Frontend;
use librepology::v1::api::Api;
/// A Frontend that formats the output in a nice ASCII-art table
@@ -28,8 +28,12 @@ impl TableFrontend {
.column_separator('|')
.borders('|')
.separators(
- &[format::LinePosition::Title, format::LinePosition::Top, format::LinePosition::Bottom],
- format::LineSeparator::new('-', '+', '+', '+')
+ &[
+ format::LinePosition::Title,
+ format::LinePosition::Top,
+ format::LinePosition::Bottom,
+ ],
+ format::LineSeparator::new('-', '+', '+', '+'),
)
.padding(1, 1)
.build();
@@ -65,7 +69,8 @@ impl Frontend for TableFrontend {
String::from("")
}; // not optimal, but works for now
- let name = package.any_name()
+ let name = package
+ .any_name()
.map(Name::deref)
.map(String::clone)
.unwrap_or_else(|| String::from("<unknown>"));
@@ -90,7 +95,12 @@ impl Frontend for TableFrontend {
self.print(table)
}
- fn compare_packages(&self, packages: Vec<ComparePackage>, backend: &Backend, filter_repos: Vec<Repo>) -> Result<()> {
+ fn compare_packages(
+ &self,
+ packages: Vec<ComparePackage>,
+ backend: &Backend,
+ filter_repos: Vec<Repo>,
+ ) -> Result<()> {
let mut table = self.mktable();
for package in packages {
backend
@@ -99,14 +109,13 @@ impl Frontend for TableFrontend {
.filter(|p| filter_repos.contains(p.repo()))
.for_each(|upstream_package| {
table.add_row(row![
- package.name().clone(),
- package.version().clone(),
- upstream_package.repo().clone(),
- upstream_package.version().clone(),
- ]);
+ package.name().clone(),
+ package.version().clone(),
+ upstream_package.repo().clone(),
+ upstream_package.version().clone(),
+ ]);
});
}
self.print(table)
}
}
-