tendermint/serializers/
hash.rs

1//! Hash serialization with validation
2
3use alloc::borrow::Cow;
4
5use serde::{de, ser, Deserialize, Deserializer, Serializer};
6use subtle_encoding::hex;
7
8use crate::{hash::Algorithm, prelude::*, Hash};
9
10/// Deserialize hexstring into Hash
11pub fn deserialize<'de, D>(deserializer: D) -> Result<Hash, D::Error>
12where
13    D: Deserializer<'de>,
14{
15    let hexstring = Option::<Cow<'_, str>>::deserialize(deserializer)?.unwrap_or(Cow::Borrowed(""));
16    Hash::from_hex_upper(Algorithm::Sha256, &hexstring).map_err(de::Error::custom)
17}
18
19/// Serialize from Hash into hexstring
20pub fn serialize<S>(value: &Hash, serializer: S) -> Result<S::Ok, S::Error>
21where
22    S: Serializer,
23{
24    let hex_bytes = hex::encode_upper(value.as_bytes());
25    let hex_string = String::from_utf8(hex_bytes).map_err(ser::Error::custom)?;
26    // Serialize as Option<String> for symmetry with deserialize
27    serializer.serialize_some(&hex_string)
28}