ctclient_async/internal/
getentries.rs1use std::convert::TryFrom;
2use std::ops::Range;
3
4use async_stream::try_stream;
5use futures::Stream;
6
7use crate::Error;
8use crate::jsons;
9
10use super::Leaf;
11use super::get_json;
12
13pub fn get_entries<'a>(
21 client: &'a reqwest::Client,
22 base_url: &'a reqwest::Url,
23 range: Range<u64>,
24 batch_size: u64,
25) -> impl Stream<Item = Result<Leaf, Error>> + 'a {
26 try_stream! {
27 let mut next_index = range.start;
28
29 while next_index < range.end {
30 let end = u64::min(next_index + batch_size, range.end);
31 let url = format!("ct/v1/get-entries?start={}&end={}", next_index, end - 1);
32
33 let entries: jsons::GetEntries = get_json(client, base_url, &url).await?;
34 if entries.entries.is_empty() {
35 break;
36 }
37
38 for entry in entries.entries {
39 let leaf = Leaf::try_from(&entry)?;
40 yield leaf;
41 }
42
43 next_index = end;
44 }
45 }
46}