tendermint/serializers/
apphash_base64.rs

1//! AppHash serialization with validation
2
3use alloc::borrow::Cow;
4
5use serde::{de, Deserialize, Deserializer, Serializer};
6use subtle_encoding::base64;
7
8use crate::{prelude::*, AppHash};
9
10/// Deserialize a base64-encoded string into an [`AppHash`]
11pub fn deserialize<'de, D>(deserializer: D) -> Result<AppHash, D::Error>
12where
13    D: Deserializer<'de>,
14{
15    let decoded = match Option::<Cow<'_, str>>::deserialize(deserializer)? {
16        Some(s) => base64::decode(s.as_bytes()).map_err(de::Error::custom)?,
17        None => vec![],
18    };
19    decoded.try_into().map_err(de::Error::custom)
20}
21
22/// Serialize from [`AppHash`] into a base64-encoded string.
23pub fn serialize<S>(value: &AppHash, serializer: S) -> Result<S::Ok, S::Error>
24where
25    S: Serializer,
26{
27    let base64_bytes = base64::encode(value.as_bytes());
28    let base64_string = String::from_utf8(base64_bytes).unwrap();
29    // Serialize as Option<String> for symmetry with deserialize
30    serializer.serialize_some(&base64_string)
31}