Skip to main content

semver/
serde.rs

1use core::fmt;
2
3use serde::{
4    Deserialize, Deserializer, Serialize, Serializer,
5    de::{self, Visitor},
6};
7
8use crate::{Version, parse};
9
10impl<'a> Serialize for Version<'a> {
11    fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
12        serializer.collect_str(self)
13    }
14}
15
16impl<'de> Deserialize<'de> for Version<'de> {
17    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
18        deserializer.deserialize_str(VersionVisitor)
19    }
20}
21
22struct VersionVisitor;
23
24impl<'de> Visitor<'de> for VersionVisitor {
25    type Value = Version<'de>;
26
27    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
28        f.write_str("a SemVer version string (e.g. \"1.2.3\" or \"1.0.0-alpha+001\")")
29    }
30
31    fn visit_borrowed_str<E: de::Error>(self, v: &'de str) -> Result<Version<'de>, E> {
32        parse(v).map_err(de::Error::custom)
33    }
34}