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