remote_files/buckets/
gcs.rs

1use 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}