@@ -12,7 +12,6 @@ use crate::{
1212 pooladdr:: { PoolAddr , PoolAddrList } ,
1313 AddrFamily , Result ,
1414} ;
15- use ipnetwork:: { IpNetwork , Ipv4Network , Ipv6Network } ;
1615use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
1716
1817#[ derive( Debug , Default , Clone , Copy , PartialEq , Eq , Hash ) ]
@@ -26,14 +25,19 @@ impl Ip {
2625 pub fn get_af ( & self ) -> AddrFamily {
2726 match * self {
2827 Ip :: Any => AddrFamily :: Any ,
29- Ip :: Net ( IpNetwork :: V4 ( _) ) => AddrFamily :: Ipv4 ,
30- Ip :: Net ( IpNetwork :: V6 ( _) ) => AddrFamily :: Ipv6 ,
28+ Ip :: Net ( network) => match network. 0 {
29+ ipnetwork:: IpNetwork :: V4 ( _) => AddrFamily :: Ipv4 ,
30+ ipnetwork:: IpNetwork :: V6 ( _) => AddrFamily :: Ipv6 ,
31+ } ,
3132 }
3233 }
3334
3435 /// Returns `Ip::Any` represented an as an `IpNetwork`, used for ffi.
35- fn any_ffi_repr ( ) -> IpNetwork {
36- IpNetwork :: V6 ( Ipv6Network :: new ( Ipv6Addr :: new ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) , 0 ) . unwrap ( ) )
36+ const fn any_ffi_repr ( ) -> IpNetwork {
37+ let any = ipnetwork:: IpNetwork :: V6 (
38+ ipnetwork:: Ipv6Network :: new_checked ( Ipv6Addr :: new ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) , 0 ) . unwrap ( ) ,
39+ ) ;
40+ IpNetwork ( any)
3741 }
3842
3943 /// Returns PoolAddrList initialized with receiver
@@ -42,6 +46,25 @@ impl Ip {
4246 }
4347}
4448
49+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
50+ pub struct IpNetwork ( ipnetwork:: IpNetwork ) ;
51+
52+ impl IpNetwork {
53+ pub fn new ( ip : IpAddr , prefix : u8 ) -> IpNetwork {
54+ // TODO: Do not unwrap
55+ let network = ipnetwork:: IpNetwork :: new ( ip, prefix) . unwrap ( ) ;
56+ IpNetwork ( network)
57+ }
58+
59+ pub fn ip ( & self ) -> IpAddr {
60+ self . 0 . ip ( )
61+ }
62+
63+ pub fn mask ( & self ) -> IpAddr {
64+ self . 0 . mask ( )
65+ }
66+ }
67+
4568impl From < IpNetwork > for Ip {
4669 fn from ( net : IpNetwork ) -> Self {
4770 Ip :: Net ( net)
@@ -50,13 +73,15 @@ impl From<IpNetwork> for Ip {
5073
5174impl From < Ipv4Addr > for Ip {
5275 fn from ( ip : Ipv4Addr ) -> Self {
53- Ip :: Net ( IpNetwork :: V4 ( Ipv4Network :: new ( ip, 32 ) . unwrap ( ) ) )
76+ let network = ipnetwork:: IpNetwork :: V4 ( ipnetwork:: Ipv4Network :: new ( ip, 32 ) . unwrap ( ) ) ;
77+ Ip :: Net ( IpNetwork ( network) )
5478 }
5579}
5680
5781impl From < Ipv6Addr > for Ip {
5882 fn from ( ip : Ipv6Addr ) -> Self {
59- Ip :: Net ( IpNetwork :: V6 ( Ipv6Network :: new ( ip, 128 ) . unwrap ( ) ) )
83+ let network = ipnetwork:: IpNetwork :: V6 ( ipnetwork:: Ipv6Network :: new ( ip, 128 ) . unwrap ( ) ) ;
84+ Ip :: Net ( IpNetwork ( network) )
6085 }
6186}
6287
0 commit comments