From 9a2af86238bf842d9fad1940cd4f24925d10ec59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Wed, 28 Jun 2023 21:20:42 +0200 Subject: [PATCH] wip: add deserialize for Digeset --- base/src/hash.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/base/src/hash.rs b/base/src/hash.rs index 1e9db9a..51a0655 100644 --- a/base/src/hash.rs +++ b/base/src/hash.rs @@ -1,6 +1,11 @@ +use std::fmt; + use crate::{addressing::Address, error::UpEndError}; use multihash::Hasher; -use serde::{ser, Serialize, Serializer}; +use serde::{ + de::{self, Visitor}, + ser, Deserialize, Deserializer, Serialize, Serializer, +}; #[derive(Debug, Clone, Eq, PartialEq, Hash)] #[cfg_attr(feature = "diesel", derive(diesel::FromSqlRow))] @@ -29,6 +34,34 @@ impl Serialize for Digest { } } +struct DigestVisitor; + +impl<'de> Visitor<'de> for DigestVisitor { + type Value = Digest; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a valid UpEnd address (hash/UUID) as a multi-hashed string") + } + + fn visit_str(self, str: &str) -> Result + where + E: de::Error, + { + b58_decode(str) + .map(|v| Digest(v)) + .map_err(|e| de::Error::custom(format!("Error deserializing digest: {}", e))) + } +} + +impl<'de> Deserialize<'de> for Digest { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(DigestVisitor) + } +} + #[cfg(feature = "diesel")] impl diesel::types::FromSql for Digest { fn from_sql(