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 pub async fn new<'a>(
30 aws_region: Option<&str>,
31 aws_access_key: Option<&str>,
32 aws_secret_access_key: Option<&str>,
33 bucket: Bucket<'a>,
34 prefix: Prefix<'a>,
35 endpoint: Endpoint<'a>,
36 object_size_limit_mb: ObjectSizeLimitMb,
37 cron_interval_in_ms: CronIntervalInMs,
38 ) -> anyhow::Result<Self> {
39 dotenv().ok();
40 let region = Region::new(
41 aws_region
42 .unwrap_or(&env::var("S3_TRACING_AWS_REGION").unwrap_or("us-east-1".to_string()))
43 .to_string(),
44 );
45 let bucket = match bucket.0 {
46 Some(bucket) => bucket.to_string(),
47 None => env::var("S3_TRACING_BUCKET")?,
48 };
49 let aws_access_key = match aws_access_key {
50 Some(access_key) => access_key.to_string(),
51 None => env::var("S3_TRACING_AWS_ACCESS_KEY_ID")?,
52 };
53 let aws_secret_access_key = match aws_secret_access_key {
54 Some(secret_access_key) => secret_access_key.to_string(),
55 None => env::var("S3_TRACING_AWS_SECRET_ACCESS_KEY")?,
56 };
57 let credentials =
58 Credentials::new(aws_access_key, aws_secret_access_key, None, None, "AWS");
59 let mut config_builder = aws_sdk_s3::Config::builder()
61 .behavior_version_latest()
62 .credentials_provider(credentials.clone())
63 .express_credentials_provider(credentials)
64 .region(region);
65 config_builder = match endpoint.0 {
66 Some(endpoint) => config_builder.endpoint_url(endpoint),
67 None => config_builder,
68 };
69 let config = config_builder.build();
70 let aws_client = Client::from_conf(config);
71 Ok(Self {
72 aws_client,
73 bucket,
74 prefix: prefix.0.to_string(),
75 object_size_limit_mb: object_size_limit_mb.0,
76 cron_interval_in_ms: cron_interval_in_ms.0,
77 })
78 }
79}