wireguard_conf/utils/
serde.rs

1use 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}