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 aws_sdk_s3::types::ObjectStorageClass;

use crate::adapters::aws::{CommandS3Client, RestoreObjectStatus};
use crate::arg::{Restore, S3Path};
use crate::command::StreamObject;

use super::RunCommand;

#[async_trait]
impl RunCommand for Restore {
    async fn execute(
        &self,
        client: &dyn CommandS3Client,
        path: &S3Path,
        stream_objects: &[StreamObject],
    ) -> Result<(), Error> {
        for stream_obj in stream_objects {
            if stream_obj.is_delete_marker {
                continue;
            }

            let object = &stream_obj.object;
            let is_glacier = object.storage_class == Some(ObjectStorageClass::Glacier)
                || object.storage_class == Some(ObjectStorageClass::DeepArchive);

            if is_glacier && object.key.is_some() {
                let key = object.key.as_deref().unwrap();
                match client
                    .restore_object(
                        &path.bucket,
                        key,
                        stream_obj.version_id.as_deref(),
                        self.days,
                        self.tier.clone(),
                    )
                    .await?
                {
                    RestoreObjectStatus::Started => {
                        println!("Restore initiated for: {}", stream_obj.display_key())
                    }
                    RestoreObjectStatus::AlreadyInProgress => {
                        println!(
                            "Restore already in progress for: {}",
                            stream_obj.display_key()
                        )
                    }
                    RestoreObjectStatus::InvalidObjectState => {
                        println!(
                            "Object is not in Glacier storage or already restored: {}",
                            stream_obj.display_key()
                        )
                    }
                }
            }
        }
        Ok(())
    }
}