scaleway-rs 0.2.8

A pure Rust scaleway API binding.
Documentation
use crate::{
    data::dns_zone::{DnsZoneOrderBy, ScalewayDnsZone, ScalewayDnsZonesRoot},
    ScalewayApi, ScalewayError,
};

/// Builder for listing DNS zones.
///
/// Created by [`ScalewayApi::list_dns_zones`](crate::ScalewayApi::list_dns_zones).
/// Auto-paginates. Call [`run`](Self::run) or [`run_async`](Self::run_async) to execute.
pub struct ScalewayListDnsZonesBuilder {
    api: ScalewayApi,
    params: Vec<(&'static str, String)>,
}

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

    /// Filter by domain name.
    pub fn domain(mut self, domain: &str) -> Self {
        self.params.push(("domain", domain.to_string()));
        self
    }

    /// Filter by exact DNS zone name.
    pub fn dns_zone(mut self, dns_zone: &str) -> Self {
        self.params.push(("dns_zone", dns_zone.to_string()));
        self
    }

    /// Filter by project ID.
    pub fn project(mut self, project_id: &str) -> Self {
        self.params.push(("project_id", project_id.to_string()));
        self
    }

    /// Filter by organization ID.
    pub fn organization(mut self, organization_id: &str) -> Self {
        self.params
            .push(("organization_id", organization_id.to_string()));
        self
    }

    /// Sets the sort order for the returned zones.
    pub fn order_by(mut self, order: DnsZoneOrderBy) -> Self {
        self.params.push(("order_by", order.to_string()));
        self
    }

    /// Number of items per page (max 100).
    pub fn page_size(mut self, size: u32) -> Self {
        self.params.push(("page_size", size.to_string()));
        self
    }

    /// Fetches all matching DNS zones, auto-paginating (blocking).
    #[cfg(feature = "blocking")]
    pub fn run(self) -> Result<Vec<ScalewayDnsZone>, ScalewayError> {
        let mut list = vec![];
        let mut page = 1u32;
        loop {
            let mut params = self.params.clone();
            params.push(("page", page.to_string()));
            let result = self
                .api
                .get(
                    "https://api.scaleway.com/domain/v2beta1/dns-zones",
                    params,
                )?
                .json::<ScalewayDnsZonesRoot>()?;
            if result.dns_zones.is_empty() {
                break;
            }
            list.extend(result.dns_zones);
            page += 1;
        }
        Ok(list)
    }

    /// Fetches all matching DNS zones, auto-paginating.
    pub async fn run_async(self) -> Result<Vec<ScalewayDnsZone>, ScalewayError> {
        let mut list = vec![];
        let mut page = 1u32;
        loop {
            let mut params = self.params.clone();
            params.push(("page", page.to_string()));
            let result = self
                .api
                .get_async(
                    "https://api.scaleway.com/domain/v2beta1/dns-zones",
                    params,
                )
                .await?
                .json::<ScalewayDnsZonesRoot>()
                .await?;
            if result.dns_zones.is_empty() {
                break;
            }
            list.extend(result.dns_zones);
            page += 1;
        }
        Ok(list)
    }
}