scaleway-rs 0.2.7

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>,
}

/// Builder for creating a new security group.
///
/// Created by [`ScalewayApi::create_security_group`](crate::ScalewayApi::create_security_group).
/// Call [`run`](Self::run) or [`run_async`](Self::run_async) to execute.
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,
            },
        }
    }

    /// Sets a human-readable description for the security group.
    pub fn description(mut self, description: &str) -> Self {
        self.config.description = Some(description.to_string());
        self
    }

    /// Associates the security group with a project.
    pub fn project(mut self, project: &str) -> Self {
        self.config.project = Some(project.to_string());
        self
    }

    /// Associates the security group with an organization.
    pub fn organization(mut self, organization: &str) -> Self {
        self.config.organization = Some(organization.to_string());
        self
    }

    /// Tags to apply to the security group.
    pub fn tags(mut self, tags: Vec<String>) -> Self {
        self.config.tags = Some(tags);
        self
    }

    /// Default policy applied to inbound traffic not matched by any rule.
    /// Defaults to `Accept`.
    pub fn inbound_default_policy(mut self, policy: SecurityGroupPolicy) -> Self {
        self.config.inbound_default_policy = Some(policy);
        self
    }

    /// Default policy applied to outbound traffic not matched by any rule.
    /// Defaults to `Accept`.
    pub fn outbound_default_policy(mut self, policy: SecurityGroupPolicy) -> Self {
        self.config.outbound_default_policy = Some(policy);
        self
    }

    /// Creates the security group and returns it (blocking).
    #[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)
    }

    /// Creates the security group and returns it.
    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)
    }
}