Skip to main content

wslplugins_rs/wsl_version/
serde_impl.rs

1use std::fmt;
2
3use serde::{
4    de::{Error, Visitor},
5    Deserialize, Deserializer, Serialize,
6};
7
8use crate::WSLVersion;
9
10impl Serialize for WSLVersion {
11    #[inline]
12    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
13    where
14        S: serde::Serializer,
15    {
16        serializer.collect_str(self)
17    }
18}
19
20impl<'de> Deserialize<'de> for WSLVersion {
21    #[inline]
22    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
23    where
24        D: Deserializer<'de>,
25    {
26        struct WSLVersionVisitor;
27
28        impl Visitor<'_> for WSLVersionVisitor {
29            type Value = WSLVersion;
30
31            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
32                formatter.write_str("WSL version")
33            }
34
35            fn visit_str<E>(self, string: &str) -> Result<Self::Value, E>
36            where
37                E: Error,
38            {
39                string.parse().map_err(Error::custom)
40            }
41        }
42
43        deserializer.deserialize_str(WSLVersionVisitor)
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use crate::WSLVersion;
50    use serde_test::{assert_tokens, Configure, Token};
51
52    #[test]
53    fn serde_version_as_semver_string() {
54        let version = WSLVersion::new(2, 4, 4);
55        assert_tokens(&version.readable(), &[Token::Str("2.4.4")]);
56    }
57}