vn_core/http/query/
mod.rs1mod 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}