aws_utils_s3 0.4.0

AWS S3 utilities for common operations like listing, uploading, downloading, and deleting objects
Documentation
use std::time::Duration;

use aws_config::{
    BehaviorVersion,
    timeout::{TimeoutConfig, TimeoutConfigBuilder},
};
use aws_credential_types::Credentials;
use aws_sdk_s3::{
    Client,
    config::{Region, SharedInterceptor},
};

pub mod bucket;
pub mod error;
pub mod object;
pub mod presigned;

pub use aws_sdk_s3;

pub async fn make_client_with_timeout_default(endpoint_url: Option<String>) -> Client {
    make_client_with_timeout(
        endpoint_url,
        Some(Duration::from_secs(3100)),
        Some(Duration::from_secs(60)),
        Some(Duration::from_secs(55)),
        Some(Duration::from_secs(50)),
    )
    .await
}

pub async fn make_client_with_timeout(
    endpoint_url: Option<String>,
    connect_timeout: Option<Duration>,
    operation_timeout: Option<Duration>,
    operation_attempt_timeout: Option<Duration>,
    read_timeout: Option<Duration>,
) -> Client {
    let mut timeout_config = TimeoutConfigBuilder::new();
    timeout_config
        .set_connect_timeout(connect_timeout)
        .set_operation_timeout(operation_timeout)
        .set_operation_attempt_timeout(operation_attempt_timeout)
        .set_read_timeout(read_timeout);
    make_client(endpoint_url, Some(timeout_config.build()), None).await
}

pub async fn make_client(
    endpoint_url: Option<String>,
    timeout_config: Option<TimeoutConfig>,
    interceptor: Option<SharedInterceptor>,
) -> Client {
    let mut config_loader = aws_config::defaults(BehaviorVersion::latest());
    if let Some(timeout_config) = timeout_config {
        config_loader = config_loader.timeout_config(timeout_config);
    }
    let config = config_loader.load().await;
    let mut builder = aws_sdk_s3::config::Builder::from(&config);
    if let Some(aws_endpoint_url) = endpoint_url {
        builder = builder
            .endpoint_url(aws_endpoint_url)
            .force_path_style(true);
    }
    if let Some(interceptor) = interceptor {
        builder.push_interceptor(interceptor);
    }
    Client::from_conf(builder.build())
}

pub async fn make_client_with_credentials(
    access_key_id: String,
    secret_access_key: String,
    region: String,
    endpoint_url: Option<String>,
    timeout_config: Option<TimeoutConfig>,
    interceptor: Option<SharedInterceptor>,
) -> Client {
    let credentials = Credentials::new(access_key_id, secret_access_key, None, None, "manual");

    let mut config_loader = aws_config::defaults(BehaviorVersion::latest())
        .credentials_provider(credentials)
        .region(Region::new(region));

    if let Some(timeout_config) = timeout_config {
        config_loader = config_loader.timeout_config(timeout_config);
    }

    let config = config_loader.load().await;
    let mut builder = aws_sdk_s3::config::Builder::from(&config);

    if let Some(aws_endpoint_url) = endpoint_url {
        builder = builder
            .endpoint_url(aws_endpoint_url)
            .force_path_style(true);
    }

    if let Some(interceptor) = interceptor {
        builder.push_interceptor(interceptor);
    }

    Client::from_conf(builder.build())
}