1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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),
}
/// Implement Api for Backend
///
/// With this, we can use the `Backend` object and do not have to care whether we have a librepology::
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)))
}
}
|