remote_files/buckets/
s3.rs

1use opendal::{services::S3, Error, Operator};
2use serde::{Deserialize, Serialize};
3
4use crate::opendal_builder;
5
6#[derive(Debug, Clone, Deserialize, Serialize)]
7pub struct S3Config {
8    pub name: String,
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub endpoint: Option<String>,
11    #[serde(skip_serializing_if = "Option::is_none")]
12    pub prefix: Option<String>,
13    #[serde(skip_serializing_if = "Option::is_none")]
14    pub region: Option<String>,
15    #[serde(rename = "accessKeyId", skip_serializing_if = "Option::is_none")]
16    pub access_key_id: Option<String>,
17    #[serde(rename = "secretAccessKey", skip_serializing_if = "Option::is_none")]
18    pub secret_access_key: Option<String>,
19    #[serde(
20        rename = "defaultStorageClass",
21        skip_serializing_if = "Option::is_none"
22    )]
23    pub default_storage_class: Option<String>,
24}
25
26impl TryInto<Operator> for S3Config {
27    type Error = Error;
28
29    fn try_into(self) -> Result<Operator, Self::Error> {
30        let builder = opendal_builder!(
31            S3::default().bucket(&self.name),
32            self.endpoint.as_deref() => endpoint,
33            self.prefix.as_deref() => root,
34            self.region.as_deref() => region,
35            self.access_key_id.as_deref() => access_key_id,
36            self.secret_access_key.as_deref() => secret_access_key,
37            self.default_storage_class.as_deref() => default_storage_class
38        );
39
40        let operator = Operator::new(builder)?.finish();
41
42        Ok(operator)
43    }
44}
45
46#[derive(Debug, Clone, Deserialize, Serialize)]
47pub struct S3Bucket {
48    pub configuration: S3Config,
49}