wireguard-conf 1.0.1

Generate Wireguard configs and interfaces with code
Documentation
use serde::{de, Deserialize, Deserializer, Serialize, Serializer};

use super::{PresharedKey, PrivateKey, PublicKey};

impl Serialize for PrivateKey {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        if serializer.is_human_readable() {
            serializer.serialize_str(&self.to_string())
        } else {
            serializer.serialize_bytes(self.as_bytes())
        }
    }
}

impl<'de> Deserialize<'de> for PrivateKey {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        if deserializer.is_human_readable() {
            let data = String::deserialize(deserializer)?;

            PrivateKey::try_from(data.as_str())
                .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(&data), &"a private key"))
        } else {
            let bytes = <[u8; 32]>::deserialize(deserializer)?;

            Ok(PrivateKey::from(bytes))
        }
    }
}

impl Serialize for PublicKey {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        if serializer.is_human_readable() {
            serializer.serialize_str(&self.to_string())
        } else {
            serializer.serialize_bytes(self.as_bytes())
        }
    }
}

impl<'de> Deserialize<'de> for PublicKey {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        if deserializer.is_human_readable() {
            let data = String::deserialize(deserializer)?;

            PublicKey::try_from(data.as_str())
                .map_err(|_| de::Error::invalid_value(de::Unexpected::Str(&data), &"a public key"))
        } else {
            let bytes = <[u8; 32]>::deserialize(deserializer)?;

            Ok(PublicKey::from(bytes))
        }
    }
}

impl Serialize for PresharedKey {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        if serializer.is_human_readable() {
            serializer.serialize_str(&self.to_string())
        } else {
            serializer.serialize_bytes(self.as_bytes())
        }
    }
}

impl<'de> Deserialize<'de> for PresharedKey {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        if deserializer.is_human_readable() {
            let data = String::deserialize(deserializer)?;

            PresharedKey::try_from(data.as_str()).map_err(|_| {
                de::Error::invalid_value(de::Unexpected::Str(&data), &"a preshared key")
            })
        } else {
            let bytes = <[u8; 32]>::deserialize(deserializer)?;

            Ok(PresharedKey::from(bytes))
        }
    }
}