use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Cidr {
#[serde(skip_serializing_if = "Option::is_none")]
pub cidr_address: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TgwUpdateCidrsRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub cidrs: Option<Vec<Cidr>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TgwAttachmentRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub aws_account_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tgw_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cidrs: Option<Vec<String>>,
}
pub use crate::types::TaskStateUpdate;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransitGatewayAttachment {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aws_tgw_uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment_uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aws_account_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cidrs: Option<Vec<CidrStatus>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CidrStatus {
#[serde(skip_serializing_if = "Option::is_none")]
pub cidr_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransitGatewayInvitation {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_share_uid: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aws_account_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shared_date: Option<String>,
}
pub struct TransitGatewayHandler {
client: CloudClient,
}
impl TransitGatewayHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get_attachments(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
self.client
.get(&format!("/subscriptions/{subscription_id}/transitGateways"))
.await
}
pub async fn get_shared_invitations(&self, subscription_id: i32) -> Result<TaskStateUpdate> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/tgw/shared-invitations"
))
.await
}
pub async fn accept_resource_share(
&self,
subscription_id: i32,
invitation_id: String,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!(
"/subscriptions/{subscription_id}/tgw/shared-invitations/{invitation_id}/accept"
),
&serde_json::json!({}),
)
.await
}
pub async fn reject_resource_share(
&self,
subscription_id: i32,
invitation_id: String,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!(
"/subscriptions/{subscription_id}/tgw/shared-invitations/{invitation_id}/reject"
),
&serde_json::json!({}),
)
.await
}
pub async fn delete_attachment(
&self,
subscription_id: i32,
attachment_id: String,
) -> Result<serde_json::Value> {
self.client
.delete(&format!(
"/subscriptions/{subscription_id}/transitGateways/{attachment_id}/attachment"
))
.await?;
Ok(serde_json::Value::Null)
}
pub async fn create_attachment_with_id(
&self,
subscription_id: i32,
tgw_id: &str,
) -> Result<TaskStateUpdate> {
let request = TgwAttachmentRequest {
tgw_id: Some(tgw_id.to_string()),
aws_account_id: None,
cidrs: None,
};
self.client
.post(
&format!("/subscriptions/{subscription_id}/transitGateways/{tgw_id}/attachment"),
&request,
)
.await
}
pub async fn create_attachment(
&self,
subscription_id: i32,
request: &TgwAttachmentRequest,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/transitGateways/attachments"),
request,
)
.await
}
pub async fn update_attachment_cidrs(
&self,
subscription_id: i32,
attachment_id: String,
request: &TgwAttachmentRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(
&format!(
"/subscriptions/{subscription_id}/transitGateways/{attachment_id}/attachment"
),
request,
)
.await
}
pub async fn get_attachments_active_active(
&self,
subscription_id: i32,
) -> Result<TaskStateUpdate> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/regions/transitGateways"
))
.await
}
pub async fn get_shared_invitations_active_active(
&self,
subscription_id: i32,
) -> Result<TaskStateUpdate> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/regions/tgw/shared-invitations"
))
.await
}
pub async fn accept_resource_share_active_active(
&self,
subscription_id: i32,
region_id: i32,
invitation_id: String,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/tgw/shared-invitations/{invitation_id}/accept"
),
&serde_json::json!({}),
)
.await
}
pub async fn reject_resource_share_active_active(
&self,
subscription_id: i32,
region_id: i32,
invitation_id: String,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/tgw/shared-invitations/{invitation_id}/reject"
),
&serde_json::json!({}),
)
.await
}
pub async fn delete_attachment_active_active(
&self,
subscription_id: i32,
region_id: i32,
attachment_id: String,
) -> Result<serde_json::Value> {
self.client
.delete(&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/tgw/attachments/{attachment_id}"
))
.await?;
Ok(serde_json::Value::Null)
}
pub async fn create_attachment_active_active(
&self,
subscription_id: i32,
region_id: i32,
request: &TgwAttachmentRequest,
) -> Result<TaskStateUpdate> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/regions/{region_id}/tgw/attachments"),
request,
)
.await
}
pub async fn update_attachment_cidrs_active_active(
&self,
subscription_id: i32,
region_id: i32,
attachment_id: String,
request: &TgwAttachmentRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(
&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/tgw/attachments/{attachment_id}/cidrs"
),
request,
)
.await
}
}