Add serde support to paper-sizes.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 6 Oct 2025 16:26:11 +0000 (09:26 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 6 Oct 2025 16:26:11 +0000 (09:26 -0700)
rust/Cargo.lock
rust/paper-sizes/Cargo.toml
rust/paper-sizes/src/lib.rs

index 88ec82c1f7d90b23eef3054e3fa9744c2a767255..14e846d3aaf567620f9ebce406e71e02bce389ce 100644 (file)
@@ -1596,6 +1596,8 @@ version = "0.1.0"
 dependencies = [
  "bindgen",
  "libc",
+ "serde",
+ "serde_json",
  "xdg",
 ]
 
@@ -2050,14 +2052,15 @@ dependencies = [
 
 [[package]]
 name = "serde_json"
-version = "1.0.141"
+version = "1.0.145"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
+checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c"
 dependencies = [
  "itoa",
  "memchr",
  "ryu",
  "serde",
+ "serde_core",
 ]
 
 [[package]]
index 88c8d94f69dfe76d6cce82d9218e5b11f23a953a..11e4e7a17d71d330a4ee5cbd838b7aca9314c286 100644 (file)
@@ -8,9 +8,13 @@ description = "Detects paper sizes and defaults"
 
 [dependencies]
 xdg = "3.0.0"
+serde = { version = "1.0", optional = true }
 
 [target.'cfg(target_os = "linux")'.dependencies]
 libc = "0.2.176"
 
 [build-dependencies]
 bindgen = "0.72.1"
+
+[dev-dependencies]
+serde_json = "1.0.145"
index f795356e04c7b450665c3eff1f48e74ce7ce7686..3303ee1033e98b1d43fa943fd5f814b3d2c4d64a 100644 (file)
@@ -240,6 +240,29 @@ impl Display for PaperSize {
     }
 }
 
+#[cfg(feature = "serde")]
+impl serde::Serialize for PaperSize {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: serde::Serializer,
+    {
+        self.to_string().serialize(serializer)
+    }
+}
+
+#[cfg(feature = "serde")]
+impl<'de> serde::Deserialize<'de> for PaperSize {
+    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+    where
+        D: serde::Deserializer<'de>,
+    {
+        use serde::de::Error;
+        String::deserialize(deserializer)?
+            .parse()
+            .map_err(D::Error::custom)
+    }
+}
+
 /// An error parsing a [PaperSpec].
 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
 pub enum ParsePaperSpecError {
@@ -1005,4 +1028,17 @@ mod tests {
             );
         }
     }
+
+    #[cfg(feature = "serde")]
+    #[test]
+    fn test_serde() {
+        assert_eq!(
+            serde_json::to_string(&PaperSize::new(8.5, 11.0, Unit::Inch)).unwrap(),
+            "\"8.5x11in\""
+        );
+        assert_eq!(
+            serde_json::from_str::<PaperSize>("\"8.5x11in\"").unwrap(),
+            PaperSize::new(8.5, 11.0, Unit::Inch)
+        )
+    }
 }