diff options
Diffstat (limited to 'src/serde.rs')
-rw-r--r-- | src/serde.rs | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/serde.rs b/src/serde.rs index 06eceb6..1fcc7d8 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -1,4 +1,4 @@ -use crate::{Version, VersionReq}; +use crate::{Comparator, Version, VersionReq}; use core::fmt; use serde::de::{Deserialize, Deserializer, Error, Visitor}; use serde::ser::{Serialize, Serializer}; @@ -21,6 +21,15 @@ impl Serialize for VersionReq { } } +impl Serialize for Comparator { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + serializer.collect_str(self) + } +} + impl<'de> Deserialize<'de> for Version { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where @@ -72,3 +81,29 @@ impl<'de> Deserialize<'de> for VersionReq { deserializer.deserialize_str(VersionReqVisitor) } } + +impl<'de> Deserialize<'de> for Comparator { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + struct ComparatorVisitor; + + impl<'de> Visitor<'de> for ComparatorVisitor { + type Value = Comparator; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("semver comparator") + } + + fn visit_str<E>(self, string: &str) -> Result<Self::Value, E> + where + E: Error, + { + string.parse().map_err(Error::custom) + } + } + + deserializer.deserialize_str(ComparatorVisitor) + } +} |