macro_rules! def_serde_traits_for {
($type:ident) => {
#[cfg(feature = "serde")]
mod serde {
use super::$type;
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
impl Serialize for $type {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
String::serialize(&self.to_string(), serializer)
}
}
impl<'de> Deserialize<'de> for $type {
fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
let s = String::deserialize(d)?;
s.parse().map_err(|e| D::Error::custom(format!("{:?}", e)))
}
}
}
};
}
pub(super) use def_serde_traits_for;
#[cfg(test)]
macro_rules! def_parse_test {
($name:ident, $type:ty, $from:expr, $compare:expr) => {
#[test]
fn $name() {
let v: $type = $from.parse().unwrap();
assert_eq!($compare, v);
}
};
}
#[cfg(test)]
pub(super) use def_parse_test;
#[cfg(test)]
macro_rules! def_failing_parse_test {
($name:ident, $type:ty, $from:expr) => {
#[test]
fn $name() {
assert!($from.parse::<$type>().is_err());
}
};
}
#[cfg(test)]
pub(super) use def_failing_parse_test;