s3ql 0.1.3

Query Language for S3
Documentation
use async_trait::async_trait;
use rusoto_core::RusotoError;
use rusoto_s3::{
    CreateBucketError, CreateBucketOutput, CreateBucketRequest, DeleteBucketError,
    DeleteBucketRequest, HeadBucketError, HeadBucketRequest, ListBucketsError, ListBucketsOutput,
    S3Client, S3,
};

#[async_trait]
pub trait Bucket: S3 {
    async fn create_s3_bucket(
        &self,
        bucket_name: String,
        bucket_req: Option<CreateBucketRequest>,
    ) -> Result<CreateBucketOutput, RusotoError<CreateBucketError>>;

    async fn drop_s3_bucket(
        &self,
        bucket_name: String,
    ) -> Result<(), RusotoError<DeleteBucketError>>;

    async fn has_s3_bucket(&self, bucket_name: String) -> Result<(), RusotoError<HeadBucketError>>;

    async fn show_s3_buckets(&self) -> Result<ListBucketsOutput, RusotoError<ListBucketsError>>;
}

#[async_trait]
impl Bucket for S3Client {
    async fn create_s3_bucket(
        &self,
        bucket_name: String,
        bucket_req: Option<CreateBucketRequest>,
    ) -> Result<CreateBucketOutput, RusotoError<CreateBucketError>> {
        if let Some(mut req) = bucket_req {
            if !bucket_name.is_empty() {
                req.bucket = bucket_name;
            }

            self.create_bucket(req).await
        } else {
            let create_bucket_req = CreateBucketRequest {
                bucket: bucket_name,
                ..Default::default()
            };

            self.create_bucket(create_bucket_req).await
        }
    }

    async fn drop_s3_bucket(
        &self,
        bucket_name: String,
    ) -> Result<(), RusotoError<DeleteBucketError>> {
        let delete_bucket_req = DeleteBucketRequest {
            bucket: bucket_name,
        };

        self.delete_bucket(delete_bucket_req).await
    }

    async fn has_s3_bucket(&self, bucket_name: String) -> Result<(), RusotoError<HeadBucketError>> {
        let delete_bucket_req = HeadBucketRequest {
            bucket: bucket_name,
        };

        self.head_bucket(delete_bucket_req).await
    }

    async fn show_s3_buckets(&self) -> Result<ListBucketsOutput, RusotoError<ListBucketsError>> {
        self.list_buckets().await
    }
}