Skip to main content

vn_core/http/query/
mod.rs

1mod json;
2mod url;
3
4use crate::model::QueryField;
5use itertools::Itertools;
6pub use json::{JsonQuery, JsonQueryBuilder, JsonQueryFilter};
7use std::collections::HashSet;
8use std::marker::PhantomData;
9pub use url::UrlQueryParams;
10
11#[derive(Clone, Debug)]
12pub struct FieldSet<T: QueryField> {
13  inner: HashSet<String>,
14  marker: PhantomData<T>,
15}
16
17impl<T: QueryField> FieldSet<T> {
18  pub const URL_QUERY_PARAM: &'static str = "fields";
19
20  pub fn from_raw<I>(iter: I) -> Self
21  where
22    I: IntoIterator<Item = String>,
23  {
24    Self {
25      inner: iter.into_iter().collect(),
26      marker: PhantomData,
27    }
28  }
29
30  pub fn with_capacity(capacity: usize) -> Self {
31    Self {
32      inner: HashSet::with_capacity(capacity),
33      marker: PhantomData,
34    }
35  }
36
37  pub fn extend<I>(&mut self, iter: I)
38  where
39    I: IntoIterator<Item = T>,
40  {
41    self.inner.extend(
42      iter
43        .into_iter()
44        .map(|field| field.to_string()),
45    );
46  }
47
48  pub fn extend_raw<I>(&mut self, iter: I)
49  where
50    I: IntoIterator<Item = String>,
51  {
52    self.inner.extend(iter);
53  }
54
55  pub fn insert(&mut self, field: &T) {
56    self.inner.insert(field.to_string());
57  }
58
59  pub fn insert_raw(&mut self, field: &str) {
60    self.inner.insert(field.to_string());
61  }
62
63  pub fn into_url_query(self) -> UrlQueryParams {
64    UrlQueryParams(vec![(Self::URL_QUERY_PARAM, self.join())])
65  }
66
67  pub fn is_empty(&self) -> bool {
68    self.inner.is_empty()
69  }
70
71  pub fn join(self) -> String {
72    self.inner.iter().join(",")
73  }
74
75  pub fn remove(&mut self, field: &T) -> bool {
76    self.inner.remove(&field.to_string())
77  }
78
79  pub fn reserve(&mut self, additional: usize) {
80    self.inner.reserve(additional);
81  }
82
83  pub fn shrink_to_fit(&mut self) {
84    self.inner.shrink_to_fit();
85  }
86}
87
88impl<T: QueryField> Default for FieldSet<T> {
89  fn default() -> Self {
90    Self {
91      inner: HashSet::new(),
92      marker: PhantomData,
93    }
94  }
95}