stdcode/
hex32.rs

1use std::convert::TryInto;
2
3use serde::Deserialize;
4use serde::Serialize;
5use serde::{Deserializer, Serializer};
6
7pub fn serialize<S>(bytes: &[u8; 32], serializer: S) -> Result<S::Ok, S::Error>
8where
9    S: Serializer,
10{
11    if serializer.is_human_readable() {
12        serializer.serialize_str(&hex::encode(bytes))
13    } else {
14        bytes.serialize(serializer)
15    }
16
17    // Could also use a wrapper type with a Display implementation to avoid
18    // allocating the String.
19    //
20    // serializer.collect_str(&Base64(bytes))
21}
22
23pub fn deserialize<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error>
24where
25    D: Deserializer<'de>,
26{
27    if deserializer.is_human_readable() {
28        let s = String::deserialize(deserializer)?;
29        hex::decode(s)
30            .map_err(serde::de::Error::custom)?
31            .try_into()
32            .map_err(|_| serde::de::Error::custom("hexadecimal length not right"))
33    } else {
34        <[u8; 32]>::deserialize(deserializer)
35    }
36    // let s = <&str>::deserialize(deserializer)?;
37    // base64::decode(s).map_err(de::Error::custom)
38}