mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-13 18:21:01 +00:00
refactor: Merge multiple FromStr visitors to a single FromStrVisitor
Only refactors, doesn't actually expose this visitor
This commit is contained in:
+35
-71
@@ -1260,24 +1260,7 @@ macro_rules! parse_ip_impl {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
struct IpAddrVisitor;
|
deserializer.deserialize_str(FromStrVisitor::<$ty>::new($expecting))
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for IpAddrVisitor {
|
|
||||||
type Value = $ty;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str($expecting)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: Error,
|
|
||||||
{
|
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_str(IpAddrVisitor)
|
|
||||||
} else {
|
} else {
|
||||||
<[u8; $size]>::deserialize(deserializer).map(<$ty>::from)
|
<[u8; $size]>::deserialize(deserializer).map(<$ty>::from)
|
||||||
}
|
}
|
||||||
@@ -1405,24 +1388,7 @@ impl<'de> Deserialize<'de> for net::IpAddr {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
struct IpAddrVisitor;
|
deserializer.deserialize_str(FromStrVisitor::new("IP address"))
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for IpAddrVisitor {
|
|
||||||
type Value = net::IpAddr;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("IP address")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: Error,
|
|
||||||
{
|
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_str(IpAddrVisitor)
|
|
||||||
} else {
|
} else {
|
||||||
use lib::net::IpAddr;
|
use lib::net::IpAddr;
|
||||||
deserialize_enum! {
|
deserialize_enum! {
|
||||||
@@ -1449,24 +1415,7 @@ macro_rules! parse_socket_impl {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
struct SocketAddrVisitor;
|
deserializer.deserialize_str(FromStrVisitor::<$ty>::new($expecting))
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for SocketAddrVisitor {
|
|
||||||
type Value = $ty;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str($expecting)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: Error,
|
|
||||||
{
|
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_str(SocketAddrVisitor)
|
|
||||||
} else {
|
} else {
|
||||||
<(_, u16)>::deserialize(deserializer).map(|(ip, port)| $new(ip, port))
|
<(_, u16)>::deserialize(deserializer).map(|(ip, port)| $new(ip, port))
|
||||||
}
|
}
|
||||||
@@ -1482,24 +1431,8 @@ impl<'de> Deserialize<'de> for net::SocketAddr {
|
|||||||
D: Deserializer<'de>,
|
D: Deserializer<'de>,
|
||||||
{
|
{
|
||||||
if deserializer.is_human_readable() {
|
if deserializer.is_human_readable() {
|
||||||
struct SocketAddrVisitor;
|
|
||||||
|
|
||||||
impl<'de> Visitor<'de> for SocketAddrVisitor {
|
deserializer.deserialize_str(FromStrVisitor::new("socket address"))
|
||||||
type Value = net::SocketAddr;
|
|
||||||
|
|
||||||
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
formatter.write_str("socket address")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
|
||||||
where
|
|
||||||
E: Error,
|
|
||||||
{
|
|
||||||
s.parse().map_err(Error::custom)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
deserializer.deserialize_str(SocketAddrVisitor)
|
|
||||||
} else {
|
} else {
|
||||||
use lib::net::SocketAddr;
|
use lib::net::SocketAddr;
|
||||||
deserialize_enum! {
|
deserialize_enum! {
|
||||||
@@ -2603,3 +2536,34 @@ atomic_impl! {
|
|||||||
atomic_impl! {
|
atomic_impl! {
|
||||||
AtomicI64 AtomicU64
|
AtomicI64 AtomicU64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
struct FromStrVisitor<T>(&'static str, PhantomData<T>);
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
impl<T> FromStrVisitor<T> {
|
||||||
|
fn new(msg: &'static str) -> Self {
|
||||||
|
FromStrVisitor(msg, PhantomData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
impl<'de, T> Visitor<'de> for FromStrVisitor<T>
|
||||||
|
where
|
||||||
|
T: str::FromStr,
|
||||||
|
T::Err: fmt::Display,
|
||||||
|
{
|
||||||
|
type Value = T;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str(self.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: Error,
|
||||||
|
{
|
||||||
|
s.parse().map_err(Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user