diff options
Diffstat (limited to 'src/backend.rs')
-rw-r--r-- | src/backend.rs | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/backend.rs b/src/backend.rs new file mode 100644 index 0000000..57afd10 --- /dev/null +++ b/src/backend.rs @@ -0,0 +1,50 @@ +use clap::ArgMatches; +use failure::Fallible as Result; + +use librepology::v1::api::Api; +use librepology::v1::restapi::RestApi; +use librepology::v1::types::*; +use librepology::v1::api::StdinWrapper; + +use crate::config::Configuration; + +/// Helper type for cli implementation +/// for being transparent in what backend we use +pub enum Backend { + Stdin(StdinWrapper), + RepologyOrg(RestApi), +} + +impl Api for Backend { + fn project<N: AsRef<str>>(&self, name: N) -> Result<Vec<Package>> { + match self { + Backend::Stdin(inner) => inner.project(name), + Backend::RepologyOrg(inner) => inner.project(name), + } + } + + fn problems_for_repo<R: AsRef<str>>(&self, repo: R) -> Result<Vec<Problem>> { + match self { + Backend::Stdin(inner) => inner.problems_for_repo(repo), + Backend::RepologyOrg(inner) => inner.problems_for_repo(repo), + } + } + + fn problems_for_maintainer<M: AsRef<str>>(&self, maintainer: M) -> Result<Vec<Problem>> { + match self { + Backend::Stdin(inner) => inner.problems_for_maintainer(maintainer), + Backend::RepologyOrg(inner) => inner.problems_for_maintainer(maintainer), + } + } +} + +pub fn new_backend(app: &ArgMatches, config: &Configuration) -> Result<Backend> { + if app.is_present("input_stdin") { + Ok(Backend::Stdin(StdinWrapper::from(::std::io::stdin()))) + } else { + debug!("Constructing backend"); + let url = config.repology_url().as_str().into(); + trace!("url = {}", url); + Ok(Backend::RepologyOrg(RestApi::new(url))) + } +} |