scaleway-rs 0.2.0

A pure Rust scaleway API binding.
Documentation
use crate::ScalewayApi;
use crate::ScalewayError;
use crate::data::security_group::{
    ScalewaySecurityGroupRule, ScalewaySecurityGroupRuleRoot, SecurityGroupRuleAction,
    SecurityGroupRuleDirection, SecurityGroupRuleProtocol,
};
use serde::Serialize;

#[derive(Serialize, Debug)]
struct CreateSecurityGroupRuleConfig {
    protocol: SecurityGroupRuleProtocol,
    direction: SecurityGroupRuleDirection,
    action: SecurityGroupRuleAction,
    ip_range: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    dest_port_from: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    dest_port_to: Option<u32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    position: Option<u32>,
}

pub struct ScalewayCreateSecurityGroupRuleBuilder {
    api: ScalewayApi,
    zone: String,
    security_group_id: String,
    config: CreateSecurityGroupRuleConfig,
}

impl ScalewayCreateSecurityGroupRuleBuilder {
    pub fn new(
        api: ScalewayApi,
        zone: &str,
        security_group_id: &str,
        ip_range: &str,
        protocol: SecurityGroupRuleProtocol,
        direction: SecurityGroupRuleDirection,
        action: SecurityGroupRuleAction,
    ) -> Self {
        ScalewayCreateSecurityGroupRuleBuilder {
            api,
            zone: zone.to_string(),
            security_group_id: security_group_id.to_string(),
            config: CreateSecurityGroupRuleConfig {
                protocol,
                direction,
                action,
                ip_range: ip_range.to_string(),
                dest_port_from: None,
                dest_port_to: None,
                position: None,
            },
        }
    }

    pub fn dest_port_from(mut self, port: u32) -> Self {
        self.config.dest_port_from = Some(port);
        self
    }

    pub fn dest_port_to(mut self, port: u32) -> Self {
        self.config.dest_port_to = Some(port);
        self
    }

    pub fn position(mut self, position: u32) -> Self {
        self.config.position = Some(position);
        self
    }

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

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