1use serde::ser::SerializeMap;
2use std::slice;
3use serde::Serialize;
4use std::collections::HashMap;
5use ijson::IValue;
6
7pub mod pairs_iter;
8pub use pairs_iter::PairsIter;
9
10pub mod pairs_array;
11pub use pairs_array::PairsArray;
12
13type Pair = (String, IValue);
14
15#[derive(Debug, PartialEq, Eq)]
16pub struct Params(pub Vec<Pair>);
17
18impl Params {
19 pub fn new() -> Params {
20 Params(Vec::new())
21 }
22
23 pub fn insert<K, V>(&mut self, key: K, value: V)
24 where
25 K: ToString,
26 V: Into<IValue>
27 {
28 self.0.push((key.to_string(), value.into()))
29 }
30
31 pub fn len(&self) -> usize {
32 self.0.len()
33 }
34}
35
36impl IntoIterator for Params {
37 type Item = Pair;
38 type IntoIter = std::vec::IntoIter<Pair>;
39
40 fn into_iter(self) -> Self::IntoIter {
41 self.0.into_iter()
42 }
43}
44
45impl<'a> IntoIterator for &'a Params {
46 type Item = &'a Pair;
47 type IntoIter = slice::Iter<'a, Pair>;
48
49 fn into_iter(self) -> Self::IntoIter {
50 self.0.iter()
51 }
52}
53
54impl<'a> IntoIterator for &'a mut Params {
55 type Item = &'a mut Pair;
56 type IntoIter = slice::IterMut<'a, Pair>;
57
58 fn into_iter(self) -> Self::IntoIter {
59 self.0.iter_mut()
60 }
61}
62
63impl From<HashMap<String, String>> for Params {
64 fn from(map: HashMap<String, String>) -> Self {
65 let mut vector = Vec::with_capacity(map.len());
66
67 for (k, v) in map {
68 vector.push((k, v.into()));
69 }
70
71 Params(vector)
72 }
73}
74
75impl<K, V, const N: usize> From<[(K, V); N]> for Params
76where
77 K: ToString,
78 V: Into<IValue>
79{
80 fn from(array: [(K, V); N]) -> Self {
81 let mut vector = Vec::with_capacity(N);
82
83 for (key, value) in array {
84 vector.push((key.to_string(), value.into()))
85 }
86
87 Params(vector)
88 }
89}
90
91impl Serialize for Params {
92 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
93 where
94 S: serde::Serializer
95 {
96 let mut map = serializer.serialize_map(Some(self.len()))?;
97
98 for (k, v) in self.into_iter() {
99 map.serialize_entry(k, v)?;
100 }
101
102 map.end()
103 }
104}
105
106#[cfg(test)]
107mod tests {
108 use super::*;
109 use std::collections::HashMap;
110
111 #[test]
112 fn from_hashmap() {
113 let hashmap = HashMap::from([
114 ("user_id".to_string(), "1".to_string())
115 ]);
116
117 let params = Params::from(hashmap);
118
119 assert_eq!(params, Params(vec![
120 ("user_id".to_string(), "1".into())
121 ]));
122 }
123}