1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
pub mod text_partition; #[cfg(feature="serde")] pub mod serde { use serde::{ Serialize, Deserialize, ser::{Serializer}, de::{Deserializer} }; use chrono::{DateTime, Utc}; pub mod date_time { use super::*; use serde::de::Error; pub fn serialize<S>(dt: &DateTime<Utc>, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer { serializer.serialize_str(&dt.to_rfc2822()) } pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error> where D: Deserializer<'de> { let as_string = String::deserialize(deserializer)?; let date_time = DateTime::parse_from_rfc2822(&as_string) .map_err(|e| D::Error::custom(format!( "invalid rfc2822 date time: {}", e )))?; Ok(date_time.with_timezone(&Utc)) } } pub mod opt_date_time { use super::*; pub fn serialize<S>( dt: &Option<DateTime<Utc>>, serializer: S ) -> Result<S::Ok, S::Error> where S: Serializer { SerOptDateTime::from(dt).serialize(serializer) } pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error> where D: Deserializer<'de> { DeOptDateTime::deserialize(deserializer).map(Into::into) } #[derive(Deserialize)] enum DeOptDateTime { Some(#[serde(with="super::date_time")] DateTime<Utc>), None } impl Into<Option<DateTime<Utc>>> for DeOptDateTime { fn into(self) -> Option<DateTime<Utc>> { match self { DeOptDateTime::Some(dt) => Some(dt), DeOptDateTime::None => None } } } #[derive(Serialize)] enum SerOptDateTime<'a> { Some(#[serde(with="super::date_time")] &'a DateTime<Utc>), None } impl<'a> From<&'a Option<DateTime<Utc>>> for SerOptDateTime<'a> { fn from(val: &'a Option<DateTime<Utc>>) -> Self { match val { Some(ref dt) => SerOptDateTime::Some(dt), None => SerOptDateTime::None } } } } }