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.rs45
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))
+ }
+}