#[macro_export]
macro_rules! derive_fromstr_from_deserialize {
($type:ty) => {
impl ::std::str::FromStr for $type {
type Err = $crate::Error;
fn from_str(s: &str) -> ::std::result::Result<$type, Self::Err> {
$crate::from_str(s)
}
}
};
($type:ty, |$var:ident| -> $err_type:ty { $err_conv:expr }) => {
impl ::std::str::FromStr for $type {
type Err = $err_type;
fn from_str(s: &str) -> ::std::result::Result<$type, Self::Err> {
$crate::from_str(s).map_err(|$var| ($err_conv))
}
}
};
($type:ty, $err_type:ty) => {
impl ::std::str::FromStr for $type {
type Err = $err_type;
fn from_str(s: &str) -> ::std::result::Result<$type, Self::Err> {
$crate::from_str(s).map_err(|e| e.into())
}
}
};
}
#[deprecated(note = "legacy alias for derive_fromstr_from_deserialize")]
#[doc(hidden)]
#[macro_export]
macro_rules! forward_from_str_to_serde {
($($tt:tt)*) => { $crate::derive_fromstr_from_deserialize!($($tt)*); }
}
#[macro_export]
macro_rules! derive_display_from_serialize {
($type:ident $(:: $type_extra:ident)* < $($lt:lifetime),+ >) => {
impl<$($lt,)*> ::std::fmt::Display for $type$(:: $type_extra)*<$($lt,)*> {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{}", $crate::to_string(self).unwrap())
}
}
};
($type:ty) => {
impl ::std::fmt::Display for $type {
fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
write!(f, "{}", $crate::to_string(self).unwrap())
}
}
};
}
#[deprecated(note = "legacy alias for derive_display_from_serialize")]
#[doc(hidden)]
#[macro_export]
macro_rules! forward_display_to_serde {
($($tt:tt)*) => { $crate::derive_display_from_serialize!($($tt)*); }
}
#[macro_export]
macro_rules! derive_deserialize_from_fromstr {
($type:ty, $expectation:expr) => {
impl<'de> ::serde::de::Deserialize<'de> for $type {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::de::Deserializer<'de>,
{
struct V;
impl<'de> ::serde::de::Visitor<'de> for V {
type Value = $type;
fn expecting(
&self,
formatter: &mut ::std::fmt::Formatter,
) -> ::std::fmt::Result {
formatter.write_str($expectation)
}
fn visit_str<E>(self, value: &str) -> ::std::result::Result<$type, E>
where
E: ::serde::de::Error,
{
value.parse().map_err(|_| {
::serde::de::Error::invalid_value(
::serde::de::Unexpected::Str(value),
&self,
)
})
}
}
deserializer.deserialize_str(V)
}
}
};
}
#[deprecated(note = "legacy alias for derive_deserialize_from_fromstr")]
#[doc(hidden)]
#[macro_export]
macro_rules! derive_deserialize_from_str {
($($tt:tt)*) => { $crate::derive_deserialize_from_fromstr!($($tt)*); }
}
#[macro_export]
macro_rules! derive_serialize_from_display {
($type:ident $(:: $type_extra:ident)* < $($lt:lifetime),+ >) => {
impl<$($lt,)*> ::serde::ser::Serialize for $type$(:: $type_extra)*<$($lt,)*> {
fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
where
S: ::serde::ser::Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
};
($type:ty) => {
impl ::serde::ser::Serialize for $type {
fn serialize<S>(&self, serializer: S) -> ::std::result::Result<S::Ok, S::Error>
where
S: ::serde::ser::Serializer,
{
serializer.serialize_str(&self.to_string())
}
}
};
}
#[test]
fn test_derive_display_from_serialize_lifetimes() {
use serde_derive::Serialize;
#[derive(Serialize)]
struct MyType<'a>(&'a str);
mod inner {
use serde_derive::Serialize;
#[derive(Serialize)]
pub struct MyType<'a>(pub &'a str);
}
derive_display_from_serialize!(MyType<'a>);
derive_display_from_serialize!(inner::MyType<'a>);
assert_eq!(MyType("x").to_string(), "x");
assert_eq!(inner::MyType("x").to_string(), "x");
}
#[test]
fn test_derive_serialize_from_display_lifetimes() {
use serde_derive::Deserialize;
#[derive(Deserialize)]
struct MyType<'a>(&'a str);
impl<'a> std::fmt::Display for MyType<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
mod inner {
use serde_derive::Deserialize;
#[derive(Deserialize)]
pub struct MyType<'a>(pub &'a str);
impl<'a> std::fmt::Display for MyType<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
}
derive_serialize_from_display!(MyType<'a>);
derive_serialize_from_display!(inner::MyType<'a>);
assert_eq!(crate::to_string(&MyType("x")).unwrap(), "x");
assert_eq!(crate::to_string(&inner::MyType("x")).unwrap(), "x");
}