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
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
use std::collections::HashMap;

pub struct QueryBuilder {
    query_string_values: HashMap<String, String>,
}

impl QueryBuilder {
    pub fn new() -> QueryBuilder {
        let query_string_values = HashMap::new();

        QueryBuilder {
            query_string_values,
        }
    }

    pub fn content_type_is(mut self, content_type_id: &str) -> QueryBuilder {
        self.query_string_values
            .insert("content_type".to_string(), content_type_id.to_string());
        self
    }

    pub fn order_by(mut self, order: &str) -> QueryBuilder {
        self.query_string_values
            .insert("order".to_string(), order.to_string());
        self
    }

    pub fn limit(mut self, limit: i32) -> QueryBuilder {
        self.query_string_values
            .insert("order".to_string(), limit.to_string());
        self
    }

    pub fn skip(mut self, skip: i32) -> QueryBuilder {
        self.query_string_values
            .insert("skip".to_string(), skip.to_string());
        self
    }

    pub fn include(mut self, level: i32) -> QueryBuilder {
        self.query_string_values
            .insert("include".to_string(), level.to_string());
        self
    }

    pub fn locale_is(mut self, locale: &str, value: &str) -> QueryBuilder {
        self.query_string_values
            .insert(locale.to_string(), value.to_string());
        self
    }

    pub fn field_equals(mut self, field: &str, value: &str) -> QueryBuilder {
        self.query_string_values
            .insert(field.to_string(), value.to_string());
        self
    }

    pub fn field_does_not_equal(mut self, field: &str, value: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, value, "[ne]");
        self
    }

    pub fn field_equals_all(mut self, field: &str, values: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, values, "[all]");
        self
    }

    pub fn field_includes(mut self, field: &str, values: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, values, "[in]");
        self
    }

    pub fn field_excludes(mut self, field: &str, values: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, values, "[nin]");
        self
    }

    pub fn field_exists(mut self, field: &str, must_exist: bool) -> QueryBuilder {
        let key = format!("{}[exists]", field);
        self.query_string_values.insert(key, must_exist.to_string());
        self
    }

    pub fn field_less_than(mut self, field: &str, value: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, value, "[lt]");
        self
    }

    pub fn field_less_than_or_equal_to(mut self, field: &str, value: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, value, "[lte]");
        self
    }

    pub fn field_greater_than(mut self, field: &str, value: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, value, "[gt]");
        self
    }

    pub fn field_greater_than_or_equal_to(mut self, field: &str, value: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, value, "[gte]");
        self
    }

    pub fn field_matches(mut self, field: &str, value: &str) -> QueryBuilder {
        self = self.add_field_restriction(field, value, "[match]");
        self
    }

    pub fn links_to_entry(mut self, id: &str) -> QueryBuilder {
        self = self.add_field_restriction("links_to_entry", id, "");
        self
    }

    pub fn links_to_asset(mut self, id: &str) -> QueryBuilder {
        self = self.add_field_restriction("links_to_asset", id, "");
        self
    }

    pub fn build(&self) -> String {
        let mut query_string = String::new();
        let mut has_query = false;
        for (query_key, query_value) in &self.query_string_values {
            if has_query {
                query_string.push_str("&");
            } else {
                query_string.push_str("?");
            }
            query_string.push_str(query_key);
            query_string.push_str("=");
            query_string.push_str(query_value.as_str());
            has_query = true;
        }

        query_string
    }

    pub fn add_field_restriction(
        mut self,
        field: &str,
        value: &str,
        operator: &str,
    ) -> QueryBuilder {
        let key = format!("{}{}", field, operator);
        self.query_string_values.insert(key, value.into());
        self
    }
}