@@ -155,24 +155,16 @@ impl TryFrom<String> for PeerInfo {
155155 type Error = Error ;
156156
157157 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+ }
173166 }
174-
175- Ok ( PeerInfo { pubkey : pubkey. unwrap ( ) , address : peer_addr. unwrap ( ) . unwrap ( ) } )
167+ Err ( Error :: PeerInfoParseFailed )
176168 }
177169}
178170
@@ -206,4 +198,35 @@ mod tests {
206198 assert_eq ! ( peers[ 0 ] , expected_peer_info) ;
207199 assert ! ( !persister. get_and_clear_did_persist( ) ) ;
208200 }
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+ }
209232}
0 commit comments