si_crypto_hashes/
serde.rs

1use crate::{HashAlgorithm, HashDigest};
2
3impl serde::Serialize for HashAlgorithm {
4    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
5    where
6        S: serde::Serializer,
7    {
8        serializer.serialize_str(self.name())
9    }
10}
11
12impl<'de> serde::Deserialize<'de> for HashAlgorithm {
13    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14    where
15        D: serde::Deserializer<'de>,
16    {
17        struct Visitor;
18
19        impl serde::de::Visitor<'_> for Visitor {
20            type Value = HashAlgorithm;
21
22            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
23                formatter.write_str("hash algorithm")
24            }
25
26            fn visit_str<E: serde::de::Error>(self, s: &str) -> Result<Self::Value, E> {
27                s.parse()
28                    .map_err(|_| E::invalid_value(serde::de::Unexpected::Str(s), &"hash algorithm"))
29            }
30        }
31
32        deserializer.deserialize_str(Visitor)
33    }
34}
35
36impl<D: AsRef<[u8]>> serde::Serialize for HashDigest<D> {
37    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
38    where
39        S: serde::Serializer,
40    {
41        serializer.serialize_str(&self.to_string())
42    }
43}
44
45impl<'de, Data: From<Vec<u8>>> serde::Deserialize<'de> for HashDigest<Data> {
46    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
47    where
48        D: serde::Deserializer<'de>,
49    {
50        struct Visitor<Data> {
51            _marker: std::marker::PhantomData<Data>,
52        }
53
54        impl<Data: From<Vec<u8>>> serde::de::Visitor<'_> for Visitor<Data> {
55            type Value = HashDigest<Data>;
56
57            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
58                formatter.write_str("hash digest")
59            }
60
61            fn visit_str<E: serde::de::Error>(self, s: &str) -> Result<Self::Value, E> {
62                s.parse()
63                    .map_err(|_| E::invalid_value(serde::de::Unexpected::Str(s), &"hash digest"))
64            }
65        }
66
67        deserializer.deserialize_str(Visitor {
68            _marker: std::marker::PhantomData,
69        })
70    }
71}