From d966061f54e976f8c5791e302bc6f81cc2efe250 Mon Sep 17 00:00:00 2001 From: Dietmar Maurer Date: Tue, 18 Jun 2019 10:22:11 +0200 Subject: [PATCH] src/serde.rs: add serde helpers --- proxmox-tools/Cargo.toml | 3 +++ proxmox-tools/src/lib.rs | 1 + proxmox-tools/src/serde.rs | 51 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 proxmox-tools/src/serde.rs diff --git a/proxmox-tools/Cargo.toml b/proxmox-tools/Cargo.toml index b8ea6530..c9ee4a93 100644 --- a/proxmox-tools/Cargo.toml +++ b/proxmox-tools/Cargo.toml @@ -12,6 +12,9 @@ endian_trait = { version = "0.6", features = ["arrays"] } libc = "0.2" valgrind_request = { version = "1.1.0", optional = true } failure = "0.1" +serde = { version = "1.0", features = ["derive"] } +base64 = "0.10" +chrono = "0.4" [features] default = [ "valgrind" ] diff --git a/proxmox-tools/src/lib.rs b/proxmox-tools/src/lib.rs index 0d6695bf..830aa765 100644 --- a/proxmox-tools/src/lib.rs +++ b/proxmox-tools/src/lib.rs @@ -4,6 +4,7 @@ use failure::*; pub mod io; pub mod vec; +pub mod serde; /// Evaluates to the offset (in bytes) of a given member within a struct #[macro_export] diff --git a/proxmox-tools/src/serde.rs b/proxmox-tools/src/serde.rs new file mode 100644 index 00000000..26bf618b --- /dev/null +++ b/proxmox-tools/src/serde.rs @@ -0,0 +1,51 @@ +//! Serialization helpers for serde + +/// Sertialize DateTime as RFC3339 +pub mod date_time_as_rfc3339 { + + use chrono::{Local, DateTime}; + use serde::{Serializer, Deserializer, Deserialize}; + + pub fn serialize(time: &DateTime, serializer: S) -> Result + where S: Serializer, + { + serializer.serialize_str(&time.to_rfc3339()) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where D: Deserializer<'de> + { + use serde::de::Error; + String::deserialize(deserializer) + .and_then(|string| { + string.parse::>() + .map_err(|err| Error::custom(err.to_string())) + }) + } +} + + +/// Serialize Vec as base64 encoded string. +pub mod bytes_as_base64 { + + use base64; + use serde::{Serializer,Deserializer, Deserialize}; + + pub fn serialize(data: &T, serializer: S) -> Result + where T: AsRef<[u8]>, + S: Serializer, + { + serializer.serialize_str(&base64::encode(data.as_ref())) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where D: Deserializer<'de> + { + use serde::de::Error; + String::deserialize(deserializer) + .and_then(|string| { + base64::decode(&string) + .map_err(|err| Error::custom(err.to_string())) + }) + } +}