pub mod bool { /// Function that always returns `true`, for use in `serde(default)` attributes. pub fn yes() -> bool { true } } pub mod string { use std::fmt::Display; use std::str::FromStr; use serde::{de, Deserialize, Deserializer, Serializer}; pub fn serialize(value: &T, serializer: S) -> Result where T: Display, S: Serializer, { serializer.collect_str(value) } pub fn deserialize<'de, T, D>(deserializer: D) -> Result where T: FromStr, T::Err: Display, D: Deserializer<'de>, { String::deserialize(deserializer)? .parse() .map_err(de::Error::custom) } } /// Unlike the default `serde` instances from `localtime`, this encodes and decodes using seconds /// instead of milliseconds. pub mod localtime { pub mod time { use localtime::LocalTime; use serde::{Deserialize, Deserializer, Serializer}; pub fn serialize(value: &LocalTime, serializer: S) -> Result where S: Serializer, { serializer.serialize_u64(value.as_secs()) } pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let seconds = u64::deserialize(deserializer)?; Ok(LocalTime::from_secs(seconds)) } } pub mod duration { use localtime::LocalDuration; use serde::{Deserialize, Deserializer, Serializer}; pub fn serialize(value: &LocalDuration, serializer: S) -> Result where S: Serializer, { serializer.serialize_u64(value.as_secs()) } pub fn deserialize<'de, D>(deserializer: D) -> Result where D: Deserializer<'de>, { let seconds = u64::deserialize(deserializer)?; Ok(LocalDuration::from_secs(seconds)) } } } /// Return true if the given value is the default for that type. pub fn is_default(t: &T) -> bool { t == &T::default() }