scaleway-rs 0.2.3

A pure Rust scaleway API binding.
Documentation
use crate::data::project::{ScalewayProject, ScalewayProjectsRoot};
use crate::ScalewayApi;
use crate::ScalewayError;

pub struct ScalewayListProjectsBuilder {
    api: ScalewayApi,
    params: Vec<(&'static str, String)>,
}

impl ScalewayListProjectsBuilder {
    pub fn new(api: ScalewayApi) -> Self {
        ScalewayListProjectsBuilder {
            api,
            params: vec![],
        }
    }

    pub fn organization_id(mut self, organization_id: &str) -> ScalewayListProjectsBuilder {
        self.params.push(("organization_id", organization_id.to_string()));
        self
    }

    pub fn name(mut self, name: &str) -> ScalewayListProjectsBuilder {
        self.params.push(("name", name.to_string()));
        self
    }

    pub fn order_by(mut self, order_by: &str) -> ScalewayListProjectsBuilder {
        self.params.push(("order_by", order_by.to_string()));
        self
    }

    pub fn page_size(mut self, page_size: u32) -> ScalewayListProjectsBuilder {
        self.params.push(("page_size", page_size.to_string()));
        self
    }

    #[cfg(feature = "blocking")]
    pub fn run(self) -> Result<Vec<ScalewayProject>, ScalewayError> {
        let mut list = vec![];
        let mut page = 1;
        loop {
            let mut params = self.params.clone();
            params.push(("page", page.to_string()));
            let result = self
                .api
                .get("https://api.scaleway.com/account/v3/projects", params)?
                .json::<ScalewayProjectsRoot>()?;
            if result.projects.is_empty() {
                break;
            }
            list.extend(result.projects.into_iter());
            page += 1;
        }
        Ok(list)
    }

    pub async fn run_async(self) -> Result<Vec<ScalewayProject>, ScalewayError> {
        let mut list = vec![];
        let mut page = 1;
        loop {
            let mut params = self.params.clone();
            params.push(("page", page.to_string()));
            let result = self
                .api
                .get_async("https://api.scaleway.com/account/v3/projects", params)
                .await?
                .json::<ScalewayProjectsRoot>()
                .await?;
            if result.projects.is_empty() {
                break;
            }
            list.extend(result.projects.into_iter());
            page += 1;
        }
        Ok(list)
    }
}