@@ -1260,24 +1260,7 @@ macro_rules! parse_ip_impl {
1260
1260
D : Deserializer <' de>,
1261
1261
{
1262
1262
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) )
1281
1264
} else {
1282
1265
<[ u8 ; $size] >:: deserialize( deserializer) . map( <$ty>:: from)
1283
1266
}
@@ -1405,24 +1388,7 @@ impl<'de> Deserialize<'de> for net::IpAddr {
1405
1388
D : Deserializer < ' de > ,
1406
1389
{
1407
1390
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" ) )
1426
1392
} else {
1427
1393
use lib:: net:: IpAddr ;
1428
1394
deserialize_enum ! {
@@ -1449,24 +1415,7 @@ macro_rules! parse_socket_impl {
1449
1415
D : Deserializer <' de>,
1450
1416
{
1451
1417
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) )
1470
1419
} else {
1471
1420
<( _, u16 ) >:: deserialize( deserializer) . map( |( ip, port) | $new( ip, port) )
1472
1421
}
@@ -1482,24 +1431,7 @@ impl<'de> Deserialize<'de> for net::SocketAddr {
1482
1431
D : Deserializer < ' de > ,
1483
1432
{
1484
1433
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" ) )
1503
1435
} else {
1504
1436
use lib:: net:: SocketAddr ;
1505
1437
deserialize_enum ! {
@@ -2603,3 +2535,39 @@ atomic_impl! {
2603
2535
atomic_impl ! {
2604
2536
AtomicI64 AtomicU64
2605
2537
}
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