@@ -155,24 +155,16 @@ impl TryFrom<String> for PeerInfo {
155
155
type Error = Error ;
156
156
157
157
fn try_from ( peer_pubkey_and_ip_addr : String ) -> Result < Self , Self :: Error > {
158
- let mut pubkey_and_addr = peer_pubkey_and_ip_addr. split ( '@' ) ;
159
- let pubkey = pubkey_and_addr. next ( ) ;
160
- let peer_addr_str = pubkey_and_addr. next ( ) ;
161
- if pubkey. is_none ( ) || peer_addr_str. is_none ( ) {
162
- return Err ( Error :: PeerInfoParseFailed ) ;
163
- }
164
-
165
- let peer_addr = peer_addr_str. unwrap ( ) . to_socket_addrs ( ) . map ( |mut r| r. next ( ) ) ;
166
- if peer_addr. is_err ( ) || peer_addr. as_ref ( ) . unwrap ( ) . is_none ( ) {
167
- return Err ( Error :: PeerInfoParseFailed ) ;
168
- }
169
-
170
- let pubkey = hex_utils:: to_compressed_pubkey ( pubkey. unwrap ( ) ) ;
171
- if pubkey. is_none ( ) {
172
- return Err ( Error :: PeerInfoParseFailed ) ;
158
+ if let Some ( ( pubkey_str, peer_str) ) = peer_pubkey_and_ip_addr. split_once ( '@' ) {
159
+ if let Some ( pubkey) = hex_utils:: to_compressed_pubkey ( pubkey_str) {
160
+ if let Some ( peer_addr) =
161
+ peer_str. to_socket_addrs ( ) . ok ( ) . and_then ( |mut r| r. next ( ) ) . map ( |pa| pa)
162
+ {
163
+ return Ok ( PeerInfo { pubkey, address : peer_addr } ) ;
164
+ }
165
+ }
173
166
}
174
-
175
- Ok ( PeerInfo { pubkey : pubkey. unwrap ( ) , address : peer_addr. unwrap ( ) . unwrap ( ) } )
167
+ Err ( Error :: PeerInfoParseFailed )
176
168
}
177
169
}
178
170
@@ -206,4 +198,35 @@ mod tests {
206
198
assert_eq ! ( peers[ 0 ] , expected_peer_info) ;
207
199
assert ! ( !persister. get_and_clear_did_persist( ) ) ;
208
200
}
201
+
202
+ #[ test]
203
+ fn peer_info_parsing ( ) {
204
+ let valid_peer_info_str =
205
+ "0276607124ebe6a6c9338517b6f485825b27c2dcc0b9fc2aa6a4c0df91194e5993@127.0.0.1:9738"
206
+ . to_string ( ) ;
207
+
208
+ let pubkey = PublicKey :: from_str (
209
+ "0276607124ebe6a6c9338517b6f485825b27c2dcc0b9fc2aa6a4c0df91194e5993" ,
210
+ )
211
+ . unwrap ( ) ;
212
+ let address: SocketAddr = "127.0.0.1:9738" . parse ( ) . unwrap ( ) ;
213
+ let expected_peer_info = PeerInfo { pubkey, address } ;
214
+
215
+ assert_eq ! ( Ok ( expected_peer_info) , PeerInfo :: try_from( valid_peer_info_str) ) ;
216
+
217
+ let invalid_peer_info_str1 =
218
+ "02-76607124-ebe6a6c9338517b6f485825b27c2dcc0b9fc2aa6a4c0df91194e5993@127.0.0.1:9738"
219
+ . to_string ( ) ;
220
+ assert_eq ! ( Err ( Error :: PeerInfoParseFailed ) , PeerInfo :: try_from( invalid_peer_info_str1) ) ;
221
+
222
+ let invalid_peer_info_str2 =
223
+ "0276607124ebe6a6c9338517b6f485825b27c2dcc0b9fc2aa6a4c0df91194e5993@333.0.0.1:9738"
224
+ . to_string ( ) ;
225
+ assert_eq ! ( Err ( Error :: PeerInfoParseFailed ) , PeerInfo :: try_from( invalid_peer_info_str2) ) ;
226
+
227
+ let invalid_peer_info_str3 =
228
+ "0276607124ebe6a6c9338517b6f485825b27c2dcc0b9fc2aa6a4c0df91194e5993@127.0.0.19738"
229
+ . to_string ( ) ;
230
+ assert_eq ! ( Err ( Error :: PeerInfoParseFailed ) , PeerInfo :: try_from( invalid_peer_info_str3) ) ;
231
+ }
209
232
}
0 commit comments