summaryrefslogtreecommitdiffstats
path: root/src/frontend/table.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/table.rs')
-rw-r--r--src/frontend/table.rs94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/frontend/table.rs b/src/frontend/table.rs
new file mode 100644
index 0000000..ba4e77a
--- /dev/null
+++ b/src/frontend/table.rs
@@ -0,0 +1,94 @@
+use std::io::Stdout;
+use std::ops::Deref;
+
+use librepology::v1::types::Package;
+use librepology::v1::types::Problem;
+use failure::Fallible as Result;
+use prettytable::format;
+use prettytable::Table;
+
+use crate::frontend::Frontend;
+
+pub struct TableFrontend(Stdout);
+
+impl TableFrontend {
+ pub fn new(stdout: Stdout) -> Self {
+ TableFrontend(stdout)
+ }
+}
+
+impl Frontend for TableFrontend {
+ fn list_packages(&self, packages: Vec<Package>) -> Result<()> {
+ let mut table = Table::new();
+ let format = format::FormatBuilder::new()
+ .column_separator('|')
+ .borders('|')
+ .separators(
+ &[format::LinePosition::Title, format::LinePosition::Top, format::LinePosition::Bottom],
+ format::LineSeparator::new('-', '+', '+', '+')
+ )
+ .padding(1, 1)
+ .build();
+ table.set_format(format);
+
+ table.set_titles(row!["Name", "Version", "Repo", "Status", "URL"]);
+
+ packages.iter().for_each(|package| {
+ let status = if let Some(stat) = package.status() {
+ format!("{}", stat)
+ } else {
+ String::from("No status")
+ }; // not optimal, but works for now.
+
+ let url = if let Some(url) = package.www() {
+ if let Some(url) = url.first() {
+ format!("{}", url.deref())
+ } else {
+ String::from("")
+ }
+ } else {
+ String::from("")
+ }; // not optimal, but works for now
+
+ table.add_row(row![package.name(), package.version(), package.repo(), status, url]);
+ });
+
+ let mut outlock = self.0.lock();
+ table.print(&mut outlock)?;
+
+ Ok(())
+ }
+
+ fn list_problems(&self, problems: Vec<Problem>) -> Result<()> {
+ let mut table = Table::new();
+ let format = format::FormatBuilder::new()
+ .column_separator('|')
+ .borders('|')
+ .separators(
+ &[format::LinePosition::Title, format::LinePosition::Top, format::LinePosition::Bottom],
+ format::LineSeparator::new('-', '+', '+', '+')
+ )
+ .padding(1, 1)
+ .build();
+ table.set_format(format);
+
+ table.set_titles(row!["Repo", "Name", "EffName", "Maintainer", "Description"]);
+
+ problems.iter().for_each(|problem| {
+ trace!("Adding row for: {:?}", problem);
+ table.add_row(row![
+ problem.repo(),
+ problem.name(),
+ problem.effname(),
+ problem.maintainer(),
+ problem.problem_description()
+ ]);
+ });
+
+ let mut outlock = self.0.lock();
+ table.print(&mut outlock)?;
+
+ Ok(())
+ }
+}
+