memberlist_proto/
serde_impl.rs1#[cfg(feature = "encryption")]
2const _: () = {
3 use super::SecretKey;
4 use base64::Engine;
5 use serde::{Deserialize, Serialize};
6
7 impl Serialize for SecretKey {
8 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9 where
10 S: serde::Serializer,
11 {
12 enum Buf {
13 Aes128([u8; 24]),
14 Aes192([u8; 32]),
15 Aes256([u8; 44]),
16 }
17
18 impl AsMut<[u8]> for Buf {
19 fn as_mut(&mut self) -> &mut [u8] {
20 match self {
21 Buf::Aes128(buf) => buf,
22 Buf::Aes192(buf) => buf,
23 Buf::Aes256(buf) => buf,
24 }
25 }
26 }
27
28 if serializer.is_human_readable() {
29 let mut buf = match self {
30 Self::Aes128(_) => Buf::Aes128([0; 24]),
31 Self::Aes192(_) => Buf::Aes192([0; 32]),
32 Self::Aes256(_) => Buf::Aes256([0; 44]),
33 };
34
35 base64::engine::general_purpose::STANDARD
36 .encode_slice(self.as_ref(), buf.as_mut())
37 .map_err(serde::ser::Error::custom)?;
38
39 serializer.serialize_str(core::str::from_utf8(buf.as_mut()).unwrap())
40 } else {
41 serializer.serialize_bytes(self)
42 }
43 }
44 }
45
46 impl<'de> Deserialize<'de> for SecretKey {
47 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48 where
49 D: serde::Deserializer<'de>,
50 {
51 if deserializer.is_human_readable() {
52 <&str as Deserialize<'de>>::deserialize(deserializer)
53 .and_then(|val| Self::try_from(val).map_err(<D::Error as serde::de::Error>::custom))
54 } else {
55 <&[u8] as Deserialize<'de>>::deserialize(deserializer)
56 .and_then(|e| Self::try_from(e).map_err(<D::Error as serde::de::Error>::custom))
57 }
58 }
59 }
60};