http4r_core/
query.rs

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}