vkclient/
structs.rs

1use serde::{Serialize, Serializer};
2use std::fmt::Display;
3
4/// Vk API List helper
5/// Serialize any iterable struct with `ToString` items to string separated by comma.
6/// Example:
7/// ```rust
8/// use vkclient::List;
9/// assert_eq!(List(vec![1, 2, 3]).to_string(), "1,2,3".to_string());
10/// ```
11#[derive(Copy, Clone, Debug, Default, Ord, PartialOrd, Eq, PartialEq)]
12pub struct List<I>(pub I);
13
14impl<Item, Iter> Serialize for List<Iter>
15where
16    Item: Display,
17    for<'a> &'a Iter: IntoIterator<Item = &'a Item>,
18{
19    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
20    where
21        S: Serializer,
22    {
23        serializer.serialize_str(&self.to_string())
24    }
25}
26
27impl<Item, Iter> Display for List<Iter>
28where
29    Item: Display,
30    for<'a> &'a Iter: IntoIterator<Item = &'a Item>,
31{
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        let mut iter = self.0.into_iter();
34
35        match iter.next() {
36            None => return Ok(()),
37            Some(i) => write!(f, "{}", i)?,
38        };
39
40        for i in iter {
41            write!(f, ",{}", i)?;
42        }
43        Ok(())
44    }
45}
46
47impl<Item, Iter> From<Iter> for List<Iter>
48where
49    Item: ToString,
50    for<'a> &'a Iter: IntoIterator<Item = &'a Item>,
51{
52    fn from(i: Iter) -> Self {
53        Self(i)
54    }
55}
56
57/// Major and minor versions of VK API
58#[derive(Copy, Clone, Eq, PartialEq, Debug)]
59pub struct Version(pub u8, pub u16);
60
61impl Default for Version {
62    fn default() -> Self {
63        Self(5, 131)
64    }
65}
66
67impl Serialize for Version {
68    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
69    where
70        S: Serializer,
71    {
72        serializer.serialize_str(&self.to_string())
73    }
74}
75
76impl Display for Version {
77    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
78        write!(f, "{}.{}", self.0, self.1)
79    }
80}
81
82#[cfg(test)]
83mod tests {
84    use crate::structs::{List, Version};
85
86    #[test]
87    fn serialize_ints() {
88        assert_eq!(List(vec![1, 2, 3]).to_string(), "1,2,3".to_owned());
89    }
90
91    #[test]
92    fn serialize_strs() {
93        assert_eq!(
94            List(vec!["id", "sex", "age"]).to_string(),
95            "id,sex,age".to_owned()
96        );
97    }
98
99    #[test]
100    fn serialize_version() {
101        assert_eq!(Version(5, 131).to_string(), "5.131".to_owned());
102    }
103}