Skip to content

Commit d64aaff

Browse files
committed
Streamlining batch_call and removing unnecessary unwraps()
1 parent d5766ab commit d64aaff

File tree

1 file changed

+11
-16
lines changed

1 file changed

+11
-16
lines changed

src/raw_client.rs

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
//!
33
//! This module contains the definition of the raw client that wraps the transport method
44
5-
use std::collections::{HashMap, HashSet, VecDeque};
5+
use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque};
66
use std::io::{BufRead, BufReader, Read, Write};
77
use std::mem::drop;
88
use std::net::{TcpStream, ToSocketAddrs};
@@ -647,8 +647,8 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
647647
fn batch_call(&self, batch: &Batch) -> Result<Vec<serde_json::Value>, Error> {
648648
let mut raw = Vec::new();
649649

650-
let mut missing_responses = HashSet::new();
651-
let mut answer = Vec::new();
650+
let mut missing_responses = BTreeSet::new();
651+
let mut answers = BTreeMap::new();
652652

653653
// Add our listener to the map before we send the request, Here we will clone the sender
654654
// for every request id, so that we only have to monitor one receiver.
@@ -681,32 +681,27 @@ impl<T: Read + Write> ElectrumApi for RawClient<T> {
681681

682682
self.increment_calls();
683683

684-
while !missing_responses.is_empty() {
685-
let req_id = *missing_responses.iter().next().unwrap();
686-
let resp = match self.recv(&receiver, req_id) {
687-
Ok(resp) => resp,
684+
for req_id in missing_responses.iter() {
685+
match self.recv(&receiver, *req_id) {
686+
Ok(mut resp) => answers.insert(
687+
resp["id"].as_u64().unwrap_or_default(),
688+
resp["result"].take(),
689+
),
688690
Err(e) => {
689691
// In case of error our sender could still be left in the map, depending on where
690692
// the error happened. Just in case, try to remove it here
691693
warn!("got error for req_id {}: {:?}", req_id, e);
692694
warn!("removing all waiting req of this batch");
693695
let mut guard = self.waiting_map.lock()?;
694696
for req_id in missing_responses.iter() {
695-
guard.remove(&req_id);
697+
guard.remove(req_id);
696698
}
697699
return Err(e);
698700
}
699701
};
700-
let resp_id = resp["id"].as_u64().unwrap() as usize;
701-
702-
missing_responses.remove(&resp_id);
703-
answer.push(resp);
704702
}
705703

706-
answer.sort_by(|a, b| a["id"].as_u64().partial_cmp(&b["id"].as_u64()).unwrap());
707-
let answer = answer.into_iter().map(|mut x| x["result"].take()).collect();
708-
709-
Ok(answer)
704+
Ok(answers.into_iter().map(|(_, r)| r).collect())
710705
}
711706

712707
fn block_headers_subscribe_raw(&self) -> Result<RawHeaderNotification, Error> {

0 commit comments

Comments
 (0)