9
9
use idna;
10
10
use parser:: { ParseError , ParseResult } ;
11
11
use percent_encoding:: { percent_decode, utf8_percent_encode, CONTROLS } ;
12
+ #[ cfg( feature = "serde" ) ]
13
+ use serde:: { Deserialize , Serialize } ;
12
14
use std:: cmp;
13
15
use std:: fmt:: { self , Formatter } ;
14
16
use std:: net:: { Ipv4Addr , Ipv6Addr } ;
15
17
18
+ #[ cfg_attr( feature = "serde" , derive( Deserialize , Serialize ) ) ]
16
19
#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
17
- pub enum HostInternal {
20
+ pub ( crate ) enum HostInternal {
18
21
None ,
19
22
Domain ,
20
23
Ipv4 ( Ipv4Addr ) ,
21
24
Ipv6 ( Ipv6Addr ) ,
22
25
}
23
26
24
- #[ cfg( feature = "serde" ) ]
25
- impl :: serde:: Serialize for HostInternal {
26
- fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
27
- where
28
- S : :: serde:: Serializer ,
29
- {
30
- // This doesn’t use `derive` because that involves
31
- // large dependencies (that take a long time to build), and
32
- // either Macros 1.1 which are not stable yet or a cumbersome build script.
33
- //
34
- // Implementing `Serializer` correctly for an enum is tricky,
35
- // so let’s use existing enums that already do.
36
- use std:: net:: IpAddr ;
37
- match * self {
38
- HostInternal :: None => None ,
39
- HostInternal :: Domain => Some ( None ) ,
40
- HostInternal :: Ipv4 ( addr) => Some ( Some ( IpAddr :: V4 ( addr) ) ) ,
41
- HostInternal :: Ipv6 ( addr) => Some ( Some ( IpAddr :: V6 ( addr) ) ) ,
42
- }
43
- . serialize ( serializer)
44
- }
45
- }
46
-
47
- #[ cfg( feature = "serde" ) ]
48
- impl < ' de > :: serde:: Deserialize < ' de > for HostInternal {
49
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
50
- where
51
- D : :: serde:: Deserializer < ' de > ,
52
- {
53
- use std:: net:: IpAddr ;
54
- Ok ( match :: serde:: Deserialize :: deserialize ( deserializer) ? {
55
- None => HostInternal :: None ,
56
- Some ( None ) => HostInternal :: Domain ,
57
- Some ( Some ( IpAddr :: V4 ( addr) ) ) => HostInternal :: Ipv4 ( addr) ,
58
- Some ( Some ( IpAddr :: V6 ( addr) ) ) => HostInternal :: Ipv6 ( addr) ,
59
- } )
60
- }
61
- }
62
-
63
27
impl < S > From < Host < S > > for HostInternal {
64
28
fn from ( host : Host < S > ) -> HostInternal {
65
29
match host {
@@ -71,6 +35,7 @@ impl<S> From<Host<S>> for HostInternal {
71
35
}
72
36
73
37
/// The host name of an URL.
38
+ #[ cfg_attr( feature = "serde" , derive( Deserialize , Serialize ) ) ]
74
39
#[ derive( Clone , Debug , Eq , PartialEq , Ord , PartialOrd , Hash ) ]
75
40
pub enum Host < S = String > {
76
41
/// A DNS domain name, as '.' dot-separated labels.
@@ -92,37 +57,6 @@ pub enum Host<S = String> {
92
57
Ipv6 ( Ipv6Addr ) ,
93
58
}
94
59
95
- #[ cfg( feature = "serde" ) ]
96
- impl < S : :: serde:: Serialize > :: serde:: Serialize for Host < S > {
97
- fn serialize < R > ( & self , serializer : R ) -> Result < R :: Ok , R :: Error >
98
- where
99
- R : :: serde:: Serializer ,
100
- {
101
- use std:: net:: IpAddr ;
102
- match * self {
103
- Host :: Domain ( ref s) => Ok ( s) ,
104
- Host :: Ipv4 ( addr) => Err ( IpAddr :: V4 ( addr) ) ,
105
- Host :: Ipv6 ( addr) => Err ( IpAddr :: V6 ( addr) ) ,
106
- }
107
- . serialize ( serializer)
108
- }
109
- }
110
-
111
- #[ cfg( feature = "serde" ) ]
112
- impl < ' de , S : :: serde:: Deserialize < ' de > > :: serde:: Deserialize < ' de > for Host < S > {
113
- fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
114
- where
115
- D : :: serde:: Deserializer < ' de > ,
116
- {
117
- use std:: net:: IpAddr ;
118
- Ok ( match :: serde:: Deserialize :: deserialize ( deserializer) ? {
119
- Ok ( s) => Host :: Domain ( s) ,
120
- Err ( IpAddr :: V4 ( addr) ) => Host :: Ipv4 ( addr) ,
121
- Err ( IpAddr :: V6 ( addr) ) => Host :: Ipv6 ( addr) ,
122
- } )
123
- }
124
- }
125
-
126
60
impl < ' a > Host < & ' a str > {
127
61
/// Return a copy of `self` that owns an allocated `String` but does not borrow an `&Url`.
128
62
pub fn to_owned ( & self ) -> Host < String > {
0 commit comments