From: Ben Pfaff Date: Mon, 6 Oct 2025 16:26:11 +0000 (-0700) Subject: Add serde support to paper-sizes. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a358eedabc4c819e4485b7eea240c51417ec5576;p=pspp Add serde support to paper-sizes. --- diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 88ec82c1f7..14e846d3aa 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -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]] diff --git a/rust/paper-sizes/Cargo.toml b/rust/paper-sizes/Cargo.toml index 88c8d94f69..11e4e7a17d 100644 --- a/rust/paper-sizes/Cargo.toml +++ b/rust/paper-sizes/Cargo.toml @@ -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" diff --git a/rust/paper-sizes/src/lib.rs b/rust/paper-sizes/src/lib.rs index f795356e04..3303ee1033 100644 --- a/rust/paper-sizes/src/lib.rs +++ b/rust/paper-sizes/src/lib.rs @@ -240,6 +240,29 @@ impl Display for PaperSize { } } +#[cfg(feature = "serde")] +impl serde::Serialize for PaperSize { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.to_string().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de> serde::Deserialize<'de> for PaperSize { + fn deserialize(deserializer: D) -> Result + 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::("\"8.5x11in\"").unwrap(), + PaperSize::new(8.5, 11.0, Unit::Inch) + ) + } }