summaryrefslogtreecommitdiffstats
path: root/src/filter.rs
blob: 334ccbd323f7a7cb630298f0b23bff2eca3b9e27 (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
use filters::filter::Filter;
use filters::ops::and::And;
use filters::ops::bool::Bool;
use filters::ops::not::Not;

use crate::config::Configuration;

struct BlackListFilter {
    repo_name: String,
}

impl BlackListFilter {
    pub fn new(repo_name: String) -> Self {
        BlackListFilter { repo_name }
    }
}

impl Filter<String> for BlackListFilter {
    fn filter(&self, element: &String) -> bool {
        element != self.repo_name
    }
}

struct WhiteListFilter {
    repo_name: String,
}

impl Filter<String> for WhiteListFilter {
    fn filter(&self, element: &String) -> bool {
        element == self.repo_name
    }
}

pub fn repo_filter(config: &Configuration) -> Box<Filter<String>> {
    let blacklist = config
        .blacklist()
        .iter()
        .cloned()
        .map(BlackListFilter::new)
        .fold(Box::new(Bool::new(true)), |accu, element| accu.and(element));
    let whitelist = config
        .whitelist()
        .iter()
        .cloned()
        .map(WhiteListFilter::new)
        .fold(Box::new(Bool::new(true)), |accu, element| accu.and(element));

    Box::new(blacklist.not().or(whitelist))
}