src/serde.rs: add serde helpers

This commit is contained in:
Dietmar Maurer 2019-06-18 10:22:11 +02:00
parent adb425aeb2
commit d966061f54
3 changed files with 55 additions and 0 deletions

View File

@ -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" ]

View File

@ -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]

View File

@ -0,0 +1,51 @@
//! Serialization helpers for serde
/// Sertialize DateTime<Local> as RFC3339
pub mod date_time_as_rfc3339 {
use chrono::{Local, DateTime};
use serde::{Serializer, Deserializer, Deserialize};
pub fn serialize<S>(time: &DateTime<Local>, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,
{
serializer.serialize_str(&time.to_rfc3339())
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Local>, D::Error>
where D: Deserializer<'de>
{
use serde::de::Error;
String::deserialize(deserializer)
.and_then(|string| {
string.parse::<DateTime<Local>>()
.map_err(|err| Error::custom(err.to_string()))
})
}
}
/// Serialize Vec<u8> as base64 encoded string.
pub mod bytes_as_base64 {
use base64;
use serde::{Serializer,Deserializer, Deserialize};
pub fn serialize<S, T>(data: &T, serializer: S) -> Result<S::Ok, S::Error>
where T: AsRef<[u8]>,
S: Serializer,
{
serializer.serialize_str(&base64::encode(data.as_ref()))
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, 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()))
})
}
}