use crate::types::{Link, ProcessorResponse};
use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CloudAccountUpdateRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cloud_account_id: Option<i32>,
pub access_key_id: String,
pub access_secret_key: String,
pub console_username: String,
pub console_password: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub sign_in_login_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CloudAccount {
#[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 status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_key_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_secret_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aws_console_role_arn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aws_user_arn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub console_username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub console_password: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sign_in_login_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CloudAccountCreateRequest {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider: Option<String>,
pub access_key_id: String,
pub access_secret_key: String,
pub console_username: String,
pub console_password: String,
pub sign_in_login_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CloudAccounts {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cloud_accounts: Option<Vec<CloudAccount>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TaskStateUpdate {
#[serde(skip_serializing_if = "Option::is_none")]
pub task_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub command_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response: Option<ProcessorResponse>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<Vec<Link>>,
}
pub struct CloudAccountsHandler {
client: CloudClient,
}
impl CloudAccountsHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get_cloud_accounts(&self) -> Result<CloudAccounts> {
self.client.get("/cloud-accounts").await
}
pub async fn create_cloud_account(
&self,
request: &CloudAccountCreateRequest,
) -> Result<TaskStateUpdate> {
self.client.post("/cloud-accounts", request).await
}
pub async fn delete_cloud_account(&self, cloud_account_id: i32) -> Result<TaskStateUpdate> {
let response = self
.client
.delete_raw(&format!("/cloud-accounts/{cloud_account_id}"))
.await?;
serde_json::from_value(response).map_err(Into::into)
}
pub async fn get_cloud_account_by_id(&self, cloud_account_id: i32) -> Result<CloudAccount> {
self.client
.get(&format!("/cloud-accounts/{cloud_account_id}"))
.await
}
pub async fn update_cloud_account(
&self,
cloud_account_id: i32,
request: &CloudAccountUpdateRequest,
) -> Result<TaskStateUpdate> {
self.client
.put(&format!("/cloud-accounts/{cloud_account_id}"), request)
.await
}
}