babelforce_manager_sdk/
http.rs1use crate::error::ManagerError;
4use crate::retry::{with_retry, RetryPolicy, Transient};
5
6#[derive(Debug, Clone)]
8pub struct Page<T> {
9 pub items: Vec<T>,
11 pub page: i32,
13 pub pages: i32,
15 pub total: Option<i32>,
17}
18
19pub(crate) async fn fetch_page<T, E, F, Fut, M>(
24 retry: &RetryPolicy,
25 map_err: M,
26 fetch: F,
27) -> Result<Page<T>, ManagerError>
28where
29 E: Transient,
30 M: Fn(E) -> ManagerError,
31 F: Fn() -> Fut,
32 Fut: std::future::Future<Output = Result<(Vec<T>, i32, i32, Option<i32>), E>>,
33{
34 let (items, pages, current, total) = with_retry(retry, true, fetch).await.map_err(map_err)?;
35 Ok(Page {
36 items,
37 page: current,
38 pages,
39 total,
40 })
41}
42
43pub(crate) async fn collect_all<T, E, F, Fut, M>(
44 retry: &RetryPolicy,
45 map_err: M,
46 mut fetch: F,
47) -> Result<Vec<T>, ManagerError>
48where
49 E: Transient,
50 M: Fn(E) -> ManagerError,
51 F: FnMut(i32) -> Fut,
52 Fut: std::future::Future<Output = Result<(Vec<T>, i32, i32), E>>,
53{
54 let mut out = Vec::new();
55 let mut page = 1;
56 loop {
57 let (items, pages, _current) = with_retry(retry, true, || fetch(page))
58 .await
59 .map_err(&map_err)?;
60 let empty = items.is_empty();
61 out.extend(items);
62 if empty || page >= pages {
66 return Ok(out);
67 }
68 page += 1;
69 }
70}