powhttp-sdk 0.1.0

Official SDK for building powhttp extensions in Rust.
Documentation
use base64::{Engine, prelude::BASE64_STANDARD};
use serde::{Deserialize, Serialize, Deserializer, Serializer};
use std::time::Duration;

pub(crate) mod base64_bytes {
    use super::*;

    pub fn serialize<S: Serializer>(data: &[u8], serializer: S) -> Result<S::Ok, S::Error> {
        serializer.serialize_str(&BASE64_STANDARD.encode(data))
    }

    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<u8>, D::Error> {
        let s = String::deserialize(deserializer)?;
        BASE64_STANDARD
            .decode(&s)
            .map_err(serde::de::Error::custom)
    }
}

pub(crate) mod hex_2d {
    use super::*;

    pub fn serialize<S: Serializer>(data: &[Vec<u8>], serializer: S) -> Result<S::Ok, S::Error> {
        use serde::ser::SerializeSeq;
        let mut seq = serializer.serialize_seq(Some(data.len()))?;
        for item in data {
            seq.serialize_element(&hex::encode(item))?;
        }
        seq.end()
    }

    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error> {
        let strings: Vec<String> = Vec::deserialize(deserializer)?;
        strings
            .iter()
            .map(|s| hex::decode(s).map_err(serde::de::Error::custom))
            .collect()
    }
}

pub(crate) mod option_duration_millis {
    use super::*;

    pub fn serialize<S: Serializer>(value: &Option<Duration>, serializer: S) -> Result<S::Ok, S::Error> {
        value.map(|d| d.as_millis() as u64).serialize(serializer)
    }

    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Option<Duration>, D::Error> {
        Ok(Option::<u64>::deserialize(deserializer)?.map(Duration::from_millis))
    }
}