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 } }