si_crypto_hashes/
serde.rs1use 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}