diff --git a/Cargo.lock b/Cargo.lock index cdf431d..af6ffdd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -476,6 +476,7 @@ dependencies = [ "base32", "criterion", "rand", + "serde", "test-case", "thiserror", ] diff --git a/Cargo.toml b/Cargo.toml index 8dc34f8..28d2830 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ bench = false [dependencies] thiserror = "2.0.18" +serde = { version = "1.0", optional = true } [dev-dependencies] test-case = "3.3.1" diff --git a/src/lib.rs b/src/lib.rs index ae40890..44bbd01 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,6 +28,9 @@ mod plc_codec; mod web_domain; +#[cfg(feature = "serde")] +mod serde; + use std::{ cmp::Ordering, fmt::{Debug, Display, Formatter}, diff --git a/src/serde.rs b/src/serde.rs new file mode 100644 index 0000000..3cb8fd5 --- /dev/null +++ b/src/serde.rs @@ -0,0 +1,43 @@ +use std::{fmt::Formatter, str::FromStr}; + +use serde::{ + de::{Deserialize, Deserializer, Error, Visitor}, + ser::{Serialize, Serializer}, +}; + +use crate::Did; + +impl<'de> Deserialize<'de> for Did { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(DidVisitor) + } +} + +struct DidVisitor; + +impl<'de> Visitor<'de> for DidVisitor { + type Value = Did; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str("DID string") + } + + fn visit_str(self, value: &str) -> Result + where + E: Error, + { + Did::from_str(value).map_err(Error::custom) + } +} + +impl Serialize for Did { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&self.to_string()) + } +}