openalex/utils/
filter.rs

1pub struct Filter {
2    inner: String,
3}
4
5impl std::fmt::Display for Filter {
6    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7        write!(f, "{}", self.inner)
8    }
9}
10
11impl Filter {
12    pub fn builder() -> FilterBuilder {
13        FilterBuilder::default()
14    }
15}
16
17#[derive(Default)]
18pub struct FilterBuilder {
19    inner: String,
20}
21
22impl FilterBuilder {
23    pub fn new(mut self, key: &str, value: &str) -> FilterBuilder {
24        self.inner.push_str(key);
25        self.inner.push(':');
26        self.inner.push_str(value);
27        self
28    }
29
30    pub fn and(mut self, key: &str, value: &str) -> FilterBuilder {
31        self.inner.push(',');
32        self.inner.push_str(key);
33        self.inner.push(':');
34        self.inner.push_str(value);
35        self
36    }
37
38    pub fn or(mut self, key: &str, value: &str) -> FilterBuilder {
39        self.inner.push('|');
40        self.inner.push_str(key);
41        self.inner.push(':');
42        self.inner.push_str(value);
43        self
44    }
45
46    pub fn build(self) -> Filter {
47        Filter { inner: self.inner }
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn filter1() {
57        let filter = Filter::builder()
58            .new("institutions.country_code", "fr")
59            .and("institutions.country_code", "gb")
60            .or("institutions.country_code", "de")
61            .build();
62
63        let correct_filter = "institutions.country_code:fr,institutions.country_code:gb|institutions.country_code:de";
64
65        assert_eq!(filter.to_string().as_str(), correct_filter);
66    }
67}