diff options
Diffstat (limited to 'src/frontend/list.rs')
-rw-r--r-- | src/frontend/list.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/frontend/list.rs b/src/frontend/list.rs new file mode 100644 index 0000000..cf5a946 --- /dev/null +++ b/src/frontend/list.rs @@ -0,0 +1,71 @@ +use std::io::Stdout; +use std::io::Write; +use std::ops::Deref; + +use librepology::v1::types::Package; +use librepology::v1::types::Problem; +use failure::Fallible as Result; +use failure::Error; + +use crate::frontend::Frontend; + +pub struct ListFrontend(Stdout); + +impl ListFrontend { + pub fn new(stdout: Stdout) -> Self { + ListFrontend(stdout) + } +} + +impl Frontend for ListFrontend { + fn list_packages(&self, packages: Vec<Package>) -> Result<()> { + let mut outlock = self.0.lock(); + + packages.iter().fold(Ok(()), |accu, package| { + accu.and_then(|_| { + 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 + + writeln!(outlock, + "{name:10} - {version:8} - {repo:15} - {status:5} - {www}", + name = package.name().deref(), + version = package.version().deref(), + repo = package.repo().deref(), + status = status, + www = url).map(|_| ()).map_err(Error::from) + }) + }) + } + + fn list_problems(&self, problems: Vec<Problem>) -> Result<()> { + let mut outlock = self.0.lock(); + + 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) + }) + }) + } +} + |