Skip to content

Commit fabadc7

Browse files
committed
f Avoid unwrapping in peer parsing and add test
1 parent 55f32b1 commit fabadc7

File tree

1 file changed

+40
-17
lines changed

1 file changed

+40
-17
lines changed

src/peer_store.rs

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)