use crate::actions::helpers;
use crate::errors::{DynoxideError, Result};
use crate::storage_backend::StorageBackend;
use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Deserialize)]
pub struct UntagResourceRequest {
#[serde(rename = "ResourceArn", default)]
pub resource_arn: Option<String>,
#[serde(rename = "TagKeys", default)]
pub tag_keys: Vec<String>,
}
#[derive(Debug, Default, Serialize)]
pub struct UntagResourceResponse {}
pub async fn execute<S: StorageBackend>(
storage: &S,
request: UntagResourceRequest,
) -> Result<UntagResourceResponse> {
let arn = request.resource_arn.as_deref().unwrap_or("");
if arn.is_empty() {
return Err(DynoxideError::ValidationException(
"Invalid TableArn".to_string(),
));
}
let table_name = helpers::parse_table_name_from_arn(arn)?;
if request.tag_keys.is_empty() {
return Err(DynoxideError::ValidationException(
"Atleast one Tag Key needs to be provided as Input.".to_string(),
));
}
if !storage.table_exists(table_name).await? {
return Err(DynoxideError::ResourceNotFoundException(
"Requested resource not found".to_string(),
));
}
storage.remove_tags(table_name, &request.tag_keys).await?;
Ok(UntagResourceResponse {})
}