summaryrefslogtreecommitdiffstats
path: root/src/backend.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend.rs')
-rw-r--r--src/backend.rs50
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)))
+ }
+}