From 56179ac613e1a6ed7f003de7dac1c2afd712d1d7 Mon Sep 17 00:00:00 2001 From: Pantonshire Date: Thu, 2 Jun 2022 22:08:58 +0100 Subject: [PATCH] impl Serialize and Deserialize for ShString --- Cargo.toml | 3 +++ src/strings/shstring.rs | 21 +++++++++++++++++++++ src/uuid.rs | 22 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 2f17f18..22edea6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,3 +2,6 @@ name = "libshire" version = "0.1.0" edition = "2021" + +[dependencies] +serde = { version = "1", optional = true } diff --git a/src/strings/shstring.rs b/src/strings/shstring.rs index 959d589..dc3afc1 100644 --- a/src/strings/shstring.rs +++ b/src/strings/shstring.rs @@ -287,6 +287,27 @@ impl fmt::Display for ShString { } } +#[cfg(feature = "serde")] +impl serde::Serialize for ShString { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer + { + serde::Serialize::serialize(&**self, serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, const N: usize> serde::Deserialize<'de> for ShString { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de> + { + serde::Deserialize::deserialize(deserializer) + .map(Self::new_from_str) + } +} + #[derive(Clone)] enum Repr { Stack(StackString), diff --git a/src/uuid.rs b/src/uuid.rs index 249fc4c..5b7371a 100644 --- a/src/uuid.rs +++ b/src/uuid.rs @@ -158,6 +158,28 @@ impl fmt::Display for Uuid { } } +#[cfg(feature = "serde")] +impl serde::Serialize for Uuid { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer + { + serde::Serialize::serialize(&*self.as_string(), serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de> serde::Deserialize<'de> for Uuid { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de> + { + let s: &str = serde::Deserialize::deserialize(deserializer)?; + s.parse() + .map_err(serde::de::Error::custom) + } +} + #[derive(Debug)] pub enum ParseError { NotEnoughGroups(usize),