summaryrefslogtreecommitdiffstats
path: root/src/backend.rs
blob: efc6f377a272236de8e1efe9bb5779e576981366 (plain)
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
54
use clap::ArgMatches;

use librepology::v1::api::Api;
use librepology::v1::error::Result;
use librepology::v1::restapi::RestApi;
use librepology::v1::stdinapi::StdinWrapper;
use librepology::v1::types::*;

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") {
        trace!("Building new STDIN backend");
        Ok(Backend::Stdin(StdinWrapper::from(::std::io::stdin())))
    } else {
        trace!("Building new remote backend");
        let url = config.repology_url().as_str().into();
        trace!("url = {}", url);
        Ok(Backend::RepologyOrg(RestApi::new(url)))
    }
}