scaleway_rs/builder/
list_marketplace_images_builder.rs

1use crate::{
2    data::marketplace_image::{ScalewayMarketplaceImage, ScalewayMarketplaceImageRoot},
3    ScalewayApi, ScalewayError,
4};
5
6pub struct ScalewayListMarketplaceImagesBuilder {
7    api: ScalewayApi,
8    params: Vec<(&'static str, String)>,
9}
10
11impl ScalewayListMarketplaceImagesBuilder {
12    pub fn new(api: ScalewayApi) -> Self {
13        ScalewayListMarketplaceImagesBuilder {
14            api,
15            params: vec![],
16        }
17    }
18
19    /// Reference: https://www.scaleway.com/en/developers/api/marketplace/#path-marketplace-images-list-marketplace-images
20    ///
21    /// Possible Values: name_asc, name_desc, created_at_asc, created_at_desc, updated_at_asc, updated_at_desc
22    pub fn order_by(mut self, order_by: &str) -> ScalewayListMarketplaceImagesBuilder {
23        self.params.push(("order_by", order_by.to_string()));
24        self
25    }
26
27    pub fn arch(mut self, arch: &str) -> ScalewayListMarketplaceImagesBuilder {
28        self.params.push(("arch", arch.to_string()));
29        self
30    }
31
32    pub fn category(mut self, category: &str) -> ScalewayListMarketplaceImagesBuilder {
33        self.params.push(("category", category.to_string()));
34        self
35    }
36
37    pub fn include_eol(mut self, include_eol: bool) -> ScalewayListMarketplaceImagesBuilder {
38        self.params.push(("include_eol", include_eol.to_string()));
39        self
40    }
41
42    #[cfg(feature = "blocking")]
43    pub fn run(self) -> Result<Vec<ScalewayMarketplaceImage>, ScalewayError> {
44        let mut list = vec![];
45        let mut page = 1;
46        loop {
47            let mut params = self.params.clone();
48            params.push(("page", page.to_string()));
49            let result = self
50                .api
51                .get("https://api.scaleway.com/marketplace/v2/images", params)?
52                .json::<ScalewayMarketplaceImageRoot>()?;
53            if result.images.len() == 0 {
54                break;
55            }
56            list.extend(result.images.into_iter());
57            if list.len() == (result.total_count as usize) {
58                break;
59            }
60            page += 1;
61        }
62        Ok(list)
63    }
64
65    pub async fn run_async(self) -> Result<Vec<ScalewayMarketplaceImage>, ScalewayError> {
66        let mut list = vec![];
67        let mut page = 1;
68        loop {
69            let mut params = self.params.clone();
70            params.push(("page", page.to_string()));
71            let result = self
72                .api
73                .get_async("https://api.scaleway.com/marketplace/v2/images", params)
74                .await?
75                .json::<ScalewayMarketplaceImageRoot>()
76                .await?;
77            if result.images.len() == 0 {
78                break;
79            }
80            list.extend(result.images.into_iter());
81            if list.len() == (result.total_count as usize) {
82                break;
83            }
84            page += 1;
85        }
86        Ok(list)
87    }
88}