vk_method/params/
pairs_iter.rs

1use super::Params;
2use serde::Serialize;
3
4/// Newtype for conversion iterator of pairs into [Params]
5/// 
6/// See also <https://stackoverflow.com/questions/63119000/why-am-i-required-to-cover-t-in-impl-foreigntraitlocaltype-for-t-e0210>
7/// 
8/// # Example
9/// ```
10/// use vk_method::{Params, PairsIter};
11/// use ijson::ijson;
12/// 
13/// let array = vec![("user_id", 1)];
14///
15/// let params = Params::try_from(PairsIter(array.into_iter())).unwrap();
16///
17/// assert_eq!(
18///     params,
19///     Params(vec![("user_id".to_string(), ijson!(1))])
20/// );
21///```
22pub struct PairsIter<K, V, I>(pub I)
23where
24    I: ExactSizeIterator<Item = (K, V)>,
25    K: ToString,
26    V: Serialize;
27
28impl<K, V, I> TryFrom<PairsIter<K, V, I>> for Params
29where
30    I: ExactSizeIterator<Item = (K, V)>,
31    K: ToString,
32    V: Serialize
33{
34    type Error = serde_json::Error;
35
36    fn try_from(pairs_iter: PairsIter<K, V, I>) -> Result<Self, Self::Error>{
37        let mut vector = Vec::with_capacity(pairs_iter.0.len());
38
39        for (k, v) in pairs_iter.0 {
40            vector.push((k.to_string(), ijson::to_value(v)?));
41        }
42
43        Ok(Params(vector))
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn from_string_pairs_iter() {
53        let array = vec![("user_ids", "1,2,3,4,5")];
54
55        let params = Params::try_from(PairsIter(array.into_iter())).unwrap();
56
57        assert_eq!(params, Params(vec![
58            ("user_ids".to_string(), "1,2,3,4,5".into())
59        ]));
60    }
61}