1use crate::{Signature, SignatureBytes};
4use ::serde::{de, ser, Deserialize, Serialize};
5use core::fmt;
6
7impl Serialize for Signature {
8 fn serialize<S: ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
9 use ser::SerializeTuple;
10
11 let mut seq = serializer.serialize_tuple(Signature::BYTE_SIZE)?;
12
13 for byte in self.to_bytes() {
14 seq.serialize_element(&byte)?;
15 }
16
17 seq.end()
18 }
19}
20
21impl<'de> Deserialize<'de> for Signature {
24 fn deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
25 struct ByteArrayVisitor;
26
27 impl<'de> de::Visitor<'de> for ByteArrayVisitor {
28 type Value = [u8; Signature::BYTE_SIZE];
29
30 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
31 formatter.write_str("bytestring of length 64")
32 }
33
34 fn visit_seq<A>(self, mut seq: A) -> Result<[u8; Signature::BYTE_SIZE], A::Error>
35 where
36 A: de::SeqAccess<'de>,
37 {
38 use de::Error;
39 let mut arr = [0u8; Signature::BYTE_SIZE];
40
41 for (i, byte) in arr.iter_mut().enumerate() {
42 *byte = seq
43 .next_element()?
44 .ok_or_else(|| Error::invalid_length(i, &self))?;
45 }
46
47 Ok(arr)
48 }
49 }
50
51 deserializer
52 .deserialize_tuple(Signature::BYTE_SIZE, ByteArrayVisitor)
53 .map(Into::into)
54 }
55}
56
57#[cfg(feature = "serde_bytes")]
58impl serde_bytes::Serialize for Signature {
59 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
60 where
61 S: serde::Serializer,
62 {
63 serializer.serialize_bytes(&self.to_bytes())
64 }
65}
66
67#[cfg(feature = "serde_bytes")]
68impl<'de> serde_bytes::Deserialize<'de> for Signature {
69 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
70 where
71 D: de::Deserializer<'de>,
72 {
73 struct ByteArrayVisitor;
74
75 impl<'de> de::Visitor<'de> for ByteArrayVisitor {
76 type Value = SignatureBytes;
77
78 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
79 formatter.write_str("bytestring of length 64")
80 }
81
82 fn visit_bytes<E>(self, bytes: &[u8]) -> Result<Self::Value, E>
83 where
84 E: de::Error,
85 {
86 use de::Error;
87
88 bytes
89 .try_into()
90 .map_err(|_| Error::invalid_length(bytes.len(), &self))
91 }
92 }
93
94 deserializer
95 .deserialize_bytes(ByteArrayVisitor)
96 .map(Into::into)
97 }
98}
99
100#[cfg(test)]
101mod tests {
102 use crate::{Signature, SignatureBytes};
103 use hex_literal::hex;
104
105 const SIGNATURE_BYTES: SignatureBytes = hex!(
106 "
107 e5564300c360ac729086e2cc806e828a
108 84877f1eb8e5d974d873e06522490155
109 5fb8821590a33bacc61e39701cf9b46b
110 d25bf5f0595bbe24655141438e7a100b
111 "
112 );
113
114 #[test]
115 fn round_trip() {
116 let signature = Signature::from_bytes(&SIGNATURE_BYTES);
117 let serialized = bincode::serialize(&signature).unwrap();
118 let deserialized = bincode::deserialize(&serialized).unwrap();
119 assert_eq!(signature, deserialized);
120 }
121}