Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'lib/text-size/src/serde_impls.rs')
| -rw-r--r-- | lib/text-size/src/serde_impls.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/text-size/src/serde_impls.rs b/lib/text-size/src/serde_impls.rs new file mode 100644 index 0000000000..4cd41618c2 --- /dev/null +++ b/lib/text-size/src/serde_impls.rs @@ -0,0 +1,45 @@ +use { + crate::{TextRange, TextSize}, + serde::{Deserialize, Deserializer, Serialize, Serializer, de}, +}; + +impl Serialize for TextSize { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + self.raw.serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for TextSize { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + u32::deserialize(deserializer).map(TextSize::from) + } +} + +impl Serialize for TextRange { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where + S: Serializer, + { + (self.start(), self.end()).serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for TextRange { + #[allow(clippy::nonminimal_bool)] + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where + D: Deserializer<'de>, + { + let (start, end) = Deserialize::deserialize(deserializer)?; + if !(start <= end) { + return Err(de::Error::custom(format!("invalid range: {:?}..{:?}", start, end))); + } + Ok(TextRange::new(start, end)) + } +} |