wslplugins_rs/wsl_version/
serde_impl.rs1use 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}