So I've got the following draft:
//Start latency timer, for rate limitting of the jsonrpc api
std::thread::spawn(|| timers::count_down_rpc());
//Spawn tasks that check if the addresses are contracts
let mut tasks = FuturesUnordered::new();
let mut contracts: HashMap<String, bool> = HashMap::new();
for entry in addr_vec {
let url = setting.jsonrpc.url_1.clone();
let address = entry.address.clone();
let latency = setting.jsonrpc.latency_1;
let container = jsonrpc::IsContractResponse {
address: address,
is_contract: false,
count: 0,
};
timers::push_time_rpc(latency);
let sleep_time = std::time::Duration::from_millis(timers::get_sleep_time_rpc() as u64);
tokio::time::sleep(sleep_time).await;
tasks.push(tokio::spawn(async move {
jsonrpc::is_contract(container, url).await
}));
}
while let Some(finished_task) = tasks.next().await {
if finished_task.is_err() {
println!(
"JoinError while scanning for contract: \n{}",
finished_task.err().unwrap()
);
continue;
}
match finished_task.unwrap() {
Err(e) => {
//!!!! Get container.count, push latency to custom timer and re-execute with different url from pool
}
Ok(v) => {
if v.is_contract {
contracts.insert(v.address, false);
}
}
}
}
I didn't think in advance I just went along step by step so I didn't foresee that on error I wouldn't have access to the container.count
and container.address
values. I was thinking of creating a custom Error
that appends the isContractResponse
struct to the error. But this would be messy as hell, but it might be my best bet. Because I need to keep count of how many times I've tried to check the specific address.
So I was wondering if any of you pros knew of a better way to do what I'm trying to do.
The full code is at https://github.com/dRAT3/merter/tree/development/src any comment on the code is much appreciated. This is my first go at rust (pun intended)