1use serde::{Serialize, Serializer};
2use std::fmt::Display;
3
4#[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#[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}