99use idna;
1010use parser:: { ParseError , ParseResult } ;
1111use percent_encoding:: { percent_decode, utf8_percent_encode, CONTROLS } ;
12+ #[ cfg( feature = "serde" ) ]
13+ use serde:: { Deserialize , Serialize } ;
1214use std:: cmp;
1315use std:: fmt:: { self , Formatter } ;
1416use std:: net:: { Ipv4Addr , Ipv6Addr } ;
1517
18+ #[ cfg_attr( feature = "serde" , derive( Deserialize , Serialize ) ) ]
1619#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
17- pub enum HostInternal {
20+ pub ( crate ) enum HostInternal {
1821 None ,
1922 Domain ,
2023 Ipv4 ( Ipv4Addr ) ,
2124 Ipv6 ( Ipv6Addr ) ,
2225}
2326
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-
6327impl < S > From < Host < S > > for HostInternal {
6428 fn from ( host : Host < S > ) -> HostInternal {
6529 match host {
@@ -71,6 +35,7 @@ impl<S> From<Host<S>> for HostInternal {
7135}
7236
7337/// The host name of an URL.
38+ #[ cfg_attr( feature = "serde" , derive( Deserialize , Serialize ) ) ]
7439#[ derive( Clone , Debug , Eq , PartialEq , Ord , PartialOrd , Hash ) ]
7540pub enum Host < S = String > {
7641 /// A DNS domain name, as '.' dot-separated labels.
@@ -92,37 +57,6 @@ pub enum Host<S = String> {
9257 Ipv6 ( Ipv6Addr ) ,
9358}
9459
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-
12660impl < ' a > Host < & ' a str > {
12761 /// Return a copy of `self` that owns an allocated `String` but does not borrow an `&Url`.
12862 pub fn to_owned ( & self ) -> Host < String > {
0 commit comments