scaleway-rs 0.2.0

A pure Rust scaleway API binding.
Documentation
use crate::ScalewayApi;
use crate::ScalewayError;
use crate::data::security_group::{
    ScalewaySecurityGroupDetails, ScalewaySecurityGroupDetailsRoot, SecurityGroupPolicy,
};
use serde::Serialize;

#[derive(Serialize, Debug)]
struct CreateSecurityGroupConfig {
    name: String,
    stateful: bool,
    description: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    project: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    organization: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    tags: Option<Vec<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    inbound_default_policy: Option<SecurityGroupPolicy>,
    #[serde(skip_serializing_if = "Option::is_none")]
    outbound_default_policy: Option<SecurityGroupPolicy>,
}

pub struct ScalewayCreateSecurityGroupBuilder {
    api: ScalewayApi,
    zone: String,
    config: CreateSecurityGroupConfig,
}

impl ScalewayCreateSecurityGroupBuilder {
    pub fn new(api: ScalewayApi, zone: &str, name: &str, stateful: bool) -> Self {
        ScalewayCreateSecurityGroupBuilder {
            api,
            zone: zone.to_string(),
            config: CreateSecurityGroupConfig {
                name: name.to_string(),
                stateful,
                description: None,
                project: None,
                organization: None,
                tags: None,
                inbound_default_policy: None,
                outbound_default_policy: None,
            },
        }
    }

    pub fn description(mut self, description: &str) -> Self {
        self.config.description = Some(description.to_string());
        self
    }

    pub fn project(mut self, project: &str) -> Self {
        self.config.project = Some(project.to_string());
        self
    }

    pub fn organization(mut self, organization: &str) -> Self {
        self.config.organization = Some(organization.to_string());
        self
    }

    pub fn tags(mut self, tags: Vec<String>) -> Self {
        self.config.tags = Some(tags);
        self
    }

    pub fn inbound_default_policy(mut self, policy: SecurityGroupPolicy) -> Self {
        self.config.inbound_default_policy = Some(policy);
        self
    }

    pub fn outbound_default_policy(mut self, policy: SecurityGroupPolicy) -> Self {
        self.config.outbound_default_policy = Some(policy);
        self
    }

    #[cfg(feature = "blocking")]
    pub fn run(self) -> Result<ScalewaySecurityGroupDetails, ScalewayError> {
        Ok(self
            .api
            .post(
                &format!(
                    "https://api.scaleway.com/instance/v1/zones/{zone}/security_groups",
                    zone = self.zone
                ),
                self.config,
            )?
            .json::<ScalewaySecurityGroupDetailsRoot>()?
            .security_group)
    }

    pub async fn run_async(self) -> Result<ScalewaySecurityGroupDetails, ScalewayError> {
        Ok(self
            .api
            .post_async(
                &format!(
                    "https://api.scaleway.com/instance/v1/zones/{zone}/security_groups",
                    zone = self.zone
                ),
                self.config,
            )
            .await?
            .json::<ScalewaySecurityGroupDetailsRoot>()
            .await?
            .security_group)
    }
}