wireguard_conf/utils/
serde.rs1use serde::{de, Deserialize, Deserializer, Serialize, Serializer};
2
3use super::{PresharedKey, PrivateKey, PublicKey};
4
5impl Serialize for PrivateKey {
6 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
7 where
8 S: Serializer,
9 {
10 if serializer.is_human_readable() {
11 serializer.serialize_str(&self.to_string())
12 } else {
13 serializer.serialize_bytes(self.as_bytes())
14 }
15 }
16}
17
18impl<'de> Deserialize<'de> for PrivateKey {
19 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
20 where
21 D: Deserializer<'de>,
22 {
23 if deserializer.is_human_readable() {
24 let data = String::deserialize(deserializer)?;
25
26 PrivateKey::try_from(data.as_str())
27 .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(&data), &"a private key"))
28 } else {
29 let bytes = <[u8; 32]>::deserialize(deserializer)?;
30
31 Ok(PrivateKey::from(bytes))
32 }
33 }
34}
35
36impl Serialize for PublicKey {
37 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
38 where
39 S: Serializer,
40 {
41 if serializer.is_human_readable() {
42 serializer.serialize_str(&self.to_string())
43 } else {
44 serializer.serialize_bytes(self.as_bytes())
45 }
46 }
47}
48
49impl<'de> Deserialize<'de> for PublicKey {
50 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
51 where
52 D: Deserializer<'de>,
53 {
54 if deserializer.is_human_readable() {
55 let data = String::deserialize(deserializer)?;
56
57 PublicKey::try_from(data.as_str())
58 .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(&data), &"a public key"))
59 } else {
60 let bytes = <[u8; 32]>::deserialize(deserializer)?;
61
62 Ok(PublicKey::from(bytes))
63 }
64 }
65}
66
67impl Serialize for PresharedKey {
68 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
69 where
70 S: Serializer,
71 {
72 if serializer.is_human_readable() {
73 serializer.serialize_str(&self.to_string())
74 } else {
75 serializer.serialize_bytes(self.as_bytes())
76 }
77 }
78}
79
80impl<'de> Deserialize<'de> for PresharedKey {
81 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
82 where
83 D: Deserializer<'de>,
84 {
85 if deserializer.is_human_readable() {
86 let data = String::deserialize(deserializer)?;
87
88 PresharedKey::try_from(data.as_str()).map_err(|_| {
89 de::Error::invalid_value(de::Unexpected::Str(&data), &"a preshared key")
90 })
91 } else {
92 let bytes = <[u8; 32]>::deserialize(deserializer)?;
93
94 Ok(PresharedKey::from(bytes))
95 }
96 }
97}