use anyhow::{Context, Result};
use tracing::info;
use s3util_rs::config::ClientConfig;
use s3util_rs::config::args::put_bucket_encryption::PutBucketEncryptionArgs;
use s3util_rs::input::json::ServerSideEncryptionConfigurationJson;
use s3util_rs::storage::s3::api;
pub async fn run_put_bucket_encryption(
args: PutBucketEncryptionArgs,
client_config: ClientConfig,
) -> Result<()> {
let bucket = args
.bucket_name()
.map_err(|e| anyhow::anyhow!("{}", e.trim_end()))?;
let config_arg = args
.server_side_encryption_configuration
.as_deref()
.ok_or_else(|| anyhow::anyhow!("server-side-encryption-configuration source required"))?;
let body = if config_arg == "-" {
let mut buf = String::new();
std::io::Read::read_to_string(&mut std::io::stdin(), &mut buf)?;
buf
} else {
std::fs::read_to_string(config_arg).with_context(|| {
format!("reading server-side-encryption configuration from {config_arg}")
})?
};
let parsed: ServerSideEncryptionConfigurationJson =
serde_json::from_str(&body).with_context(|| format!("parsing JSON from {config_arg}"))?;
let cfg = parsed.into_sdk()?;
let client = client_config.create_client().await;
if args.dry_run {
info!(bucket = %bucket, "[dry-run] would put bucket encryption.");
return Ok(());
}
api::put_bucket_encryption(&client, &bucket, cfg).await?;
info!(bucket = %bucket, "Bucket encryption set.");
Ok(())
}