s3find 0.16.1

A command line utility to walk an Amazon S3 hierarchy. s3find is an analog of find for Amazon S3.
Documentation
use anyhow::Error;
use async_trait::async_trait;

use crate::adapters::aws::{CommandS3Client, DeleteObjectRequest};
use crate::arg::{MultipleDelete, S3Path};
use crate::command::StreamObject;
use crate::error::FunctionError;

use super::RunCommand;

#[async_trait]
impl RunCommand for MultipleDelete {
    async fn execute(
        &self,
        client: &dyn CommandS3Client,
        path: &S3Path,
        list: &[StreamObject],
    ) -> Result<(), Error> {
        let key_list = list
            .iter()
            .map(|stream_obj| {
                let key = stream_obj
                    .object
                    .key
                    .clone()
                    .ok_or(FunctionError::ObjectFieldError)?;

                Ok(DeleteObjectRequest {
                    key,
                    version_id: stream_obj.version_id.clone(),
                })
            })
            .collect::<Result<Vec<_>, FunctionError>>()?;

        if key_list.is_empty() {
            return Ok(());
        }

        for object in client.delete_objects(&path.bucket, key_list).await? {
            let version_info = object
                .version_id
                .as_ref()
                .map(|v| format!(" (version: {})", v))
                .unwrap_or_default();
            println!(
                "deleted: s3://{}/{}{}",
                &path.bucket,
                object.key.as_deref().unwrap_or(""),
                version_info
            );
        }

        Ok(())
    }
}