remote_files/buckets/
s3.rs1use 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}