@@ -18,7 +18,10 @@ use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6, Ipv4Addr, Ipv6Addr};
18
18
/// Representation of a Multiaddr.
19
19
#[ derive( PartialEq , Eq , Clone , Debug , Hash ) ]
20
20
pub struct Multiaddr {
21
- bytes : Vec < u8 > ,
21
+ addr : Vec < Addr > ,
22
+
23
+ #[ deprecated]
24
+ bytes : Vec < u8 >
22
25
}
23
26
24
27
impl ToString for Multiaddr {
@@ -34,10 +37,11 @@ impl ToString for Multiaddr {
34
37
/// ```
35
38
///
36
39
fn to_string ( & self ) -> String {
37
- parser:: address_from_bytes ( self . as_slice ( ) ) . expect ( "failed to validate at construction" )
40
+ parser:: multiaddr_to_str ( & self . addr )
38
41
}
39
42
}
40
43
44
+ #[ allow( deprecated) ] // We have to access our own deprecated `bytes` field
41
45
impl Multiaddr {
42
46
/// Create a new multiaddr based on a string representation, like
43
47
/// `/ip4/127.0.0.1/udp/1234`.
@@ -57,17 +61,26 @@ impl Multiaddr {
57
61
/// ```
58
62
///
59
63
pub fn new ( input : & str ) -> Result < Multiaddr > {
60
- let bytes = parser:: multiaddr_from_str ( input) ?;
64
+ let addr = parser:: multiaddr_from_str ( input) ?;
65
+
66
+ Ok ( Multiaddr { bytes : Self :: _addr_to_bytes ( & addr) , addr : addr } )
67
+ }
61
68
62
- Ok ( Multiaddr { bytes : bytes } )
69
+ fn _addr_to_bytes ( addr : & Vec < Addr > ) -> Vec < u8 > {
70
+ let mut bytes = Vec :: new ( ) ;
71
+ for addr_segment in addr {
72
+ addr_segment. to_stream ( & mut bytes) . unwrap ( ) ;
73
+ }
74
+ bytes
63
75
}
64
76
65
77
/// Return a copy to disallow changing the bytes directly
66
78
pub fn to_bytes ( & self ) -> Vec < u8 > {
67
- self . bytes . to_owned ( )
79
+ Self :: _addr_to_bytes ( & self . addr )
68
80
}
69
81
70
82
/// Extracts a slice containing the entire underlying vector.
83
+ #[ deprecated( note="Use `.to_bytes()` instead" ) ]
71
84
pub fn as_slice ( & self ) -> & [ u8 ] {
72
85
& self . bytes
73
86
}
@@ -85,8 +98,27 @@ impl Multiaddr {
85
98
/// assert_eq!(address.protocol(), vec![Protocol::IP4]);
86
99
/// ```
87
100
///
101
+ #[ deprecated( note="Use `.segments()` instead" ) ]
88
102
pub fn protocol ( & self ) -> Vec < Protocol > {
89
- parser:: protocol_from_bytes ( & self . bytes [ ..] ) . expect ( "failed to validate at construction" )
103
+ self . addr . iter ( ) . map ( |s| s. protocol ( ) ) . collect ( )
104
+ }
105
+
106
+ /// Return the individual address segments of this multiaddr
107
+ ///
108
+ /// # Examples
109
+ ///
110
+ /// A single protocol
111
+ ///
112
+ /// ```
113
+ /// use std::net::Ipv4Addr;
114
+ /// use multiaddr::{Multiaddr, protocol};
115
+ ///
116
+ /// let address = Multiaddr::new("/ip4/127.0.0.1").unwrap();
117
+ /// assert_eq!(address.segments(), [protocol::Addr::IP4(protocol::IP4Addr(Ipv4Addr::new(127, 0, 0, 1)))]);
118
+ /// ```
119
+ ///
120
+ pub fn segments ( & self ) -> & [ Addr ] {
121
+ & self . addr
90
122
}
91
123
92
124
/// Wrap a given Multiaddr and return the combination.
@@ -102,12 +134,10 @@ impl Multiaddr {
102
134
/// ```
103
135
///
104
136
pub fn encapsulate < T : ToMultiaddr > ( & self , input : T ) -> Result < Multiaddr > {
105
- let new = input. to_multiaddr ( ) ?;
106
- let mut bytes = self . bytes . clone ( ) ;
107
-
108
- bytes. extend ( new. to_bytes ( ) ) ;
109
-
110
- Ok ( Multiaddr { bytes : bytes } )
137
+ let mut multiaddr = self . clone ( ) ;
138
+ multiaddr. addr . extend ( input. to_multiaddr ( ) ?. addr ) ;
139
+ multiaddr. bytes = Self :: _addr_to_bytes ( & multiaddr. addr ) ;
140
+ Ok ( multiaddr)
111
141
}
112
142
113
143
/// Remove the outer most address from itself.
@@ -138,36 +168,16 @@ impl Multiaddr {
138
168
/// ```
139
169
///
140
170
pub fn decapsulate < T : ToMultiaddr > ( & self , input : T ) -> Result < Multiaddr > {
141
- let input = input. to_multiaddr ( ) ?. to_bytes ( ) ;
142
-
143
- let bytes_len = self . bytes . len ( ) ;
144
- let input_length = input. len ( ) ;
145
-
146
- let mut input_pos = 0 ;
147
- let mut matches = false ;
148
-
149
- for ( i, _) in self . bytes . iter ( ) . enumerate ( ) {
150
- let next = i + input_length;
171
+ let input = input. to_multiaddr ( ) ?;
151
172
152
- if next > bytes_len {
153
- continue ;
173
+ for ( idx, addr_window) in self . addr . windows ( input. addr . len ( ) ) . enumerate ( ) {
174
+ if addr_window == input. addr . as_slice ( ) {
175
+ let addr = self . addr . iter ( ) . take ( idx) . map ( |s| s. clone ( ) ) . collect ( ) ;
176
+ return Ok ( Multiaddr { bytes : Self :: _addr_to_bytes ( & addr) , addr : addr } ) ;
154
177
}
155
-
156
- if & self . bytes [ i..next] == input. as_slice ( ) {
157
- matches = true ;
158
- input_pos = i;
159
- break ;
160
- }
161
- }
162
-
163
- if !matches {
164
- return Ok ( Multiaddr { bytes : self . bytes . clone ( ) } ) ;
165
178
}
166
179
167
- let mut bytes = self . bytes . clone ( ) ;
168
- bytes. truncate ( input_pos) ;
169
-
170
- Ok ( Multiaddr { bytes : bytes } )
180
+ Ok ( self . clone ( ) )
171
181
}
172
182
}
173
183
0 commit comments