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}