vk_method/
params.rs

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}