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