termii_rust/common/
pagination.rs

1use async_trait::async_trait;
2
3use crate::common::errors;
4
5pub trait PaginatedResource {
6    type Item;
7
8    fn _get(&self, page: &str) -> Result<Vec<Self::Item>, errors::HttpError>;
9
10    fn all(&self) -> Result<Vec<Self::Item>, errors::HttpError> {
11        let mut current_page = 1usize;
12        let mut result: Vec<Self::Item> = Vec::new();
13
14        loop {
15            let response = self._get(current_page.to_string().as_str())?;
16
17            if response.len() == 0 {
18                break;
19            }
20            result.extend(response);
21
22            current_page += 1;
23        }
24
25        Ok(result)
26    }
27}
28
29#[async_trait]
30pub trait PaginatedResourceAsync {
31    type Item: Send;
32
33    async fn _get(&self, page: &str) -> Result<Vec<Self::Item>, errors::HttpError>;
34
35    async fn all(&self) -> Result<Vec<Self::Item>, errors::HttpError> {
36        let mut current_page = 1usize;
37        let mut result: Vec<Self::Item> = Vec::new();
38
39        loop {
40            let response = self._get(current_page.to_string().as_str()).await?;
41
42            if response.len() == 0 {
43                break;
44            }
45            result.extend(response);
46
47            current_page += 1;
48        }
49
50        Ok(result)
51    }
52}