Skip to content

Commit 78a9dbc

Browse files
authored
Merge pull request #1948 from Marwes/from_str
refactor: Merge multiple FromStr visitors to a single FromStrVisitor
2 parents 4c89cf8 + 391d3ab commit 78a9dbc

File tree

1 file changed

+40
-72
lines changed

1 file changed

+40
-72
lines changed

serde/src/de/impls.rs

+40-72
Original file line numberDiff line numberDiff line change
@@ -1260,24 +1260,7 @@ macro_rules! parse_ip_impl {
12601260
D: Deserializer<'de>,
12611261
{
12621262
if deserializer.is_human_readable() {
1263-
struct IpAddrVisitor;
1264-
1265-
impl<'de> Visitor<'de> for IpAddrVisitor {
1266-
type Value = $ty;
1267-
1268-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1269-
formatter.write_str($expecting)
1270-
}
1271-
1272-
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1273-
where
1274-
E: Error,
1275-
{
1276-
s.parse().map_err(Error::custom)
1277-
}
1278-
}
1279-
1280-
deserializer.deserialize_str(IpAddrVisitor)
1263+
deserializer.deserialize_str(FromStrVisitor::new($expecting))
12811264
} else {
12821265
<[u8; $size]>::deserialize(deserializer).map(<$ty>::from)
12831266
}
@@ -1405,24 +1388,7 @@ impl<'de> Deserialize<'de> for net::IpAddr {
14051388
D: Deserializer<'de>,
14061389
{
14071390
if deserializer.is_human_readable() {
1408-
struct IpAddrVisitor;
1409-
1410-
impl<'de> Visitor<'de> for IpAddrVisitor {
1411-
type Value = net::IpAddr;
1412-
1413-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1414-
formatter.write_str("IP address")
1415-
}
1416-
1417-
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1418-
where
1419-
E: Error,
1420-
{
1421-
s.parse().map_err(Error::custom)
1422-
}
1423-
}
1424-
1425-
deserializer.deserialize_str(IpAddrVisitor)
1391+
deserializer.deserialize_str(FromStrVisitor::new("IP address"))
14261392
} else {
14271393
use lib::net::IpAddr;
14281394
deserialize_enum! {
@@ -1449,24 +1415,7 @@ macro_rules! parse_socket_impl {
14491415
D: Deserializer<'de>,
14501416
{
14511417
if deserializer.is_human_readable() {
1452-
struct SocketAddrVisitor;
1453-
1454-
impl<'de> Visitor<'de> for SocketAddrVisitor {
1455-
type Value = $ty;
1456-
1457-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1458-
formatter.write_str($expecting)
1459-
}
1460-
1461-
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1462-
where
1463-
E: Error,
1464-
{
1465-
s.parse().map_err(Error::custom)
1466-
}
1467-
}
1468-
1469-
deserializer.deserialize_str(SocketAddrVisitor)
1418+
deserializer.deserialize_str(FromStrVisitor::new($expecting))
14701419
} else {
14711420
<(_, u16)>::deserialize(deserializer).map(|(ip, port)| $new(ip, port))
14721421
}
@@ -1482,24 +1431,7 @@ impl<'de> Deserialize<'de> for net::SocketAddr {
14821431
D: Deserializer<'de>,
14831432
{
14841433
if deserializer.is_human_readable() {
1485-
struct SocketAddrVisitor;
1486-
1487-
impl<'de> Visitor<'de> for SocketAddrVisitor {
1488-
type Value = net::SocketAddr;
1489-
1490-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
1491-
formatter.write_str("socket address")
1492-
}
1493-
1494-
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
1495-
where
1496-
E: Error,
1497-
{
1498-
s.parse().map_err(Error::custom)
1499-
}
1500-
}
1501-
1502-
deserializer.deserialize_str(SocketAddrVisitor)
1434+
deserializer.deserialize_str(FromStrVisitor::new("socket address"))
15031435
} else {
15041436
use lib::net::SocketAddr;
15051437
deserialize_enum! {
@@ -2603,3 +2535,39 @@ atomic_impl! {
26032535
atomic_impl! {
26042536
AtomicI64 AtomicU64
26052537
}
2538+
2539+
#[cfg(feature = "std")]
2540+
struct FromStrVisitor<T> {
2541+
expecting: &'static str,
2542+
ty: PhantomData<T>,
2543+
}
2544+
2545+
#[cfg(feature = "std")]
2546+
impl<T> FromStrVisitor<T> {
2547+
fn new(expecting: &'static str) -> Self {
2548+
FromStrVisitor {
2549+
expecting: expecting,
2550+
ty: PhantomData,
2551+
}
2552+
}
2553+
}
2554+
2555+
#[cfg(feature = "std")]
2556+
impl<'de, T> Visitor<'de> for FromStrVisitor<T>
2557+
where
2558+
T: str::FromStr,
2559+
T::Err: fmt::Display,
2560+
{
2561+
type Value = T;
2562+
2563+
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
2564+
formatter.write_str(self.expecting)
2565+
}
2566+
2567+
fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
2568+
where
2569+
E: Error,
2570+
{
2571+
s.parse().map_err(Error::custom)
2572+
}
2573+
}

0 commit comments

Comments
 (0)