use serde::{Deserialize, Serialize};
pub mod datetime {
use chrono::{DateTime, TimeZone, Utc};
use serde::{Deserialize, Deserializer, Serializer};
const FORMAT: &str = "%Y/%m/%d,%H:%M:%S";
pub fn serialize<S>(date: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", date.format(FORMAT));
serializer.serialize_str(&s)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
Utc.datetime_from_str(&String::deserialize(deserializer)?, FORMAT)
.map_err(serde::de::Error::custom)
}
}
pub mod date {
use chrono::NaiveDate;
use serde::{Deserialize, Deserializer, Serializer};
const FORMAT: &str = "%d %B %Y";
pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", date.format(FORMAT));
serializer.serialize_str(&s)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
D: Deserializer<'de>,
{
NaiveDate::parse_from_str(&String::deserialize(deserializer)?, FORMAT)
.map_err(serde::de::Error::custom)
}
}
pub mod date_m_dd_yyyy {
use chrono::NaiveDate;
use serde::{Deserialize, Deserializer, Serializer};
const FORMAT: &str = "%B %d, %Y";
pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", date.format(FORMAT));
serializer.serialize_str(&s)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
D: Deserializer<'de>,
{
NaiveDate::parse_from_str(&String::deserialize(deserializer)?, FORMAT)
.map_err(serde::de::Error::custom)
}
}
#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct KeyedValue<T> {
pub key: T,
}
pub mod keyed_value {
use crate::format::KeyedValue;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize,
{
KeyedValue { key: value }.serialize(serializer)
}
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
Ok(KeyedValue::deserialize(deserializer)?.key)
}
}
pub mod keyed_list {
use crate::format::KeyedValue;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn serialize<S, T>(values: &[T], serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize,
{
values
.iter()
.map(|x| KeyedValue { key: x })
.collect::<Vec<KeyedValue<&T>>>()
.serialize(serializer)
}
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
let result: Vec<KeyedValue<T>> = Deserialize::deserialize(deserializer)?;
let x1: Vec<T> = result.into_iter().map(|x: KeyedValue<T>| x.key).collect();
Ok(x1)
}
}
pub mod value {
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Deserialize, Serialize)]
struct TypedValue<T> {
value: T,
}
pub fn serialize<S, T>(value: T, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: Serialize,
{
TypedValue { value }.serialize(serializer)
}
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: Deserialize<'de>,
{
Ok(Some(TypedValue::deserialize(deserializer)?.value))
}
}