1use aws_credential_types::Credentials;
2use aws_sdk_s3::Client;
3use aws_types::region::Region;
4use dotenv::dotenv;
5use std::env;
6
7#[derive(Debug)]
8pub struct CurrentLogObject {
9 pub path: String,
10 pub size: usize,
11}
12
13#[derive(Debug)]
14pub struct Config {
15 pub aws_client: Client,
16 pub bucket: String,
17 pub prefix: String,
18 pub object_size_limit_mb: usize,
19 pub cron_interval_in_ms: usize,
20}
21
22pub struct ObjectSizeLimitMb(pub usize);
23pub struct CronIntervalInMs(pub usize);
24pub struct Bucket<'a>(pub Option<&'a str>);
25pub struct Prefix<'a>(pub &'a str);
26pub struct Endpoint<'a>(pub Option<&'a str>);
27
28impl Config {
29 #[allow(clippy::too_many_arguments)]
30 pub async fn new<'a>(
31 aws_region: Option<&str>,
32 aws_access_key: Option<&str>,
33 aws_secret_access_key: Option<&str>,
34 bucket: Bucket<'a>,
35 prefix: Prefix<'a>,
36 endpoint: Endpoint<'a>,
37 object_size_limit_mb: ObjectSizeLimitMb,
38 cron_interval_in_ms: CronIntervalInMs,
39 ) -> anyhow::Result<Self> {
40 dotenv().ok();
41 let region = Region::new(
42 aws_region
43 .unwrap_or(&env::var("S3_TRACING_AWS_REGION").unwrap_or("us-east-1".to_string()))
44 .to_string(),
45 );
46 let bucket = match bucket.0 {
47 Some(bucket) => bucket.to_string(),
48 None => env::var("S3_TRACING_BUCKET")?,
49 };
50 let aws_access_key = match aws_access_key {
51 Some(access_key) => access_key.to_string(),
52 None => env::var("S3_TRACING_AWS_ACCESS_KEY_ID")?,
53 };
54 let aws_secret_access_key = match aws_secret_access_key {
55 Some(secret_access_key) => secret_access_key.to_string(),
56 None => env::var("S3_TRACING_AWS_SECRET_ACCESS_KEY")?,
57 };
58 let credentials =
59 Credentials::new(aws_access_key, aws_secret_access_key, None, None, "AWS");
60 let mut config_builder = aws_sdk_s3::Config::builder()
62 .behavior_version_latest()
63 .credentials_provider(credentials.clone())
64 .express_credentials_provider(credentials)
65 .region(region);
66 config_builder = match endpoint.0 {
67 Some(endpoint) => config_builder.endpoint_url(endpoint),
68 None => config_builder,
69 };
70 let config = config_builder.build();
71 let aws_client = Client::from_conf(config);
72 Ok(Self {
73 aws_client,
74 bucket,
75 prefix: prefix.0.to_string(),
76 object_size_limit_mb: object_size_limit_mb.0,
77 cron_interval_in_ms: cron_interval_in_ms.0,
78 })
79 }
80}