1 use crate::{Version, VersionReq};
2 use core::fmt;
3 use serde::de::{Deserialize, Deserializer, Error, Visitor};
4 use serde::ser::{Serialize, Serializer};
5 
6 impl Serialize for Version {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,7     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
8     where
9         S: Serializer,
10     {
11         serializer.collect_str(self)
12     }
13 }
14 
15 impl Serialize for VersionReq {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,16     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17     where
18         S: Serializer,
19     {
20         serializer.collect_str(self)
21     }
22 }
23 
24 impl<'de> Deserialize<'de> for Version {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,25     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26     where
27         D: Deserializer<'de>,
28     {
29         struct VersionVisitor;
30 
31         impl<'de> Visitor<'de> for VersionVisitor {
32             type Value = Version;
33 
34             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
35                 formatter.write_str("semver version")
36             }
37 
38             fn visit_str<E>(self, string: &str) -> Result<Self::Value, E>
39             where
40                 E: Error,
41             {
42                 string.parse().map_err(Error::custom)
43             }
44         }
45 
46         deserializer.deserialize_str(VersionVisitor)
47     }
48 }
49 
50 impl<'de> Deserialize<'de> for VersionReq {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,51     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52     where
53         D: Deserializer<'de>,
54     {
55         struct VersionReqVisitor;
56 
57         impl<'de> Visitor<'de> for VersionReqVisitor {
58             type Value = VersionReq;
59 
60             fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
61                 formatter.write_str("semver version")
62             }
63 
64             fn visit_str<E>(self, string: &str) -> Result<Self::Value, E>
65             where
66                 E: Error,
67             {
68                 string.parse().map_err(Error::custom)
69             }
70         }
71 
72         deserializer.deserialize_str(VersionReqVisitor)
73     }
74 }
75