1pub type QueryType = (String, String);
2pub struct Query {
3 pub vec: Vec<QueryType>
4}
5
6impl From<&str> for Query {
7 fn from(str: &str) -> Self {
8 let mut query = Query::empty();
9 str.split("&").for_each(|q| {
10 let pair = q.split("=").collect::<Vec<&str>>();
11 if pair.len() == 2 {
12 let [key, value] = [pair[0], pair[1]];
13 query = query.add((key, value));
14 }
15 });
16 query
17 }
18}
19
20impl From<Option<&str>> for Query {
21 fn from(option: Option<&str>) -> Self {
22 if option.is_none() {
23 Query::empty()
24 } else {
25 Query::from(option.unwrap())
26 }
27 }
28}
29
30impl From<Vec<(&str, &str)>> for Query {
31 fn from(vec: Vec<(&str, &str)>) -> Self {
32 let mut new = Vec::with_capacity(vec.len());
33 for q in vec {
34 new.push((q.0.to_string(), q.1.to_string()))
35 }
36 Query { vec: new }
37 }
38}
39
40impl Query {
41 pub fn empty() -> Query {
42 Query { vec: vec!() }
43 }
44
45 pub fn get(self, by: &str) -> Option<String> {
46 self.vec.iter().find_map(|pair| {
47 if pair.clone().0 == by {
48 Some(pair.clone().1)
49 } else { None }
50 })
51 }
52
53 pub fn get_all(&self, p0: &str) -> Vec<QueryType> {
54 self.vec.iter().filter(|q|{
55 q.clone().0 == p0
56 }).map(|t| (t.clone().0, t.clone().1))
57 .collect::<Vec<QueryType>>()
58 }
59
60 pub fn add(&self, pair: (&str, &str)) -> Query {
61 let mut new = vec!();
62 for q in &self.vec {
63 new.push(q.clone())
64 }
65 new.push((pair.0.to_string(), pair.1.to_string()));
66 Query { vec: new }
67 }
68
69 pub fn replace(&self, pair: (&str, &str)) -> Query {
70 let mut new = vec!();
71 let mut seen = false;
72 for q in &self.vec {
73 if q.0 == pair.0 && seen == false {
74 new.push((pair.0.to_string(), pair.1.to_string()));
75 seen = true
76 }
77 if q.0 != pair.0 {
78 new.push(q.clone())
79 }
80 }
81 if seen == false {
82 new.push((pair.0.to_string(), pair.1.to_string()));
83 }
84 Query { vec: new }
85 }
86}