opendal_service_obs/
config.rs1use std::fmt::Debug;
19
20use serde::Deserialize;
21use serde::Serialize;
22
23use super::backend::ObsBuilder;
24
25#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
27#[serde(default)]
28#[non_exhaustive]
29pub struct ObsConfig {
30 pub root: Option<String>,
32 pub endpoint: Option<String>,
34 pub access_key_id: Option<String>,
36 pub secret_access_key: Option<String>,
38 pub bucket: Option<String>,
40 #[deprecated(
42 since = "0.57.0",
43 note = "OBS versioning capability is not controlled by this option and this option is no longer needed."
44 )]
45 pub enable_versioning: bool,
46}
47
48impl Debug for ObsConfig {
49 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50 f.debug_struct("ObsConfig")
51 .field("root", &self.root)
52 .field("endpoint", &self.endpoint)
53 .field("bucket", &self.bucket)
54 .finish_non_exhaustive()
55 }
56}
57
58impl opendal_core::Configurator for ObsConfig {
59 type Builder = ObsBuilder;
60
61 fn from_uri(uri: &opendal_core::OperatorUri) -> opendal_core::Result<Self> {
62 let mut map = uri.options().clone();
63
64 if let Some(name) = uri.name() {
65 map.insert("bucket".to_string(), name.to_string());
66 }
67
68 if let Some(root) = uri.root() {
69 map.insert("root".to_string(), root.to_string());
70 }
71
72 Self::from_iter(map)
73 }
74
75 fn into_builder(self) -> Self::Builder {
76 ObsBuilder { config: self }
77 }
78}
79
80#[cfg(test)]
81mod tests {
82 use super::*;
83 use opendal_core::Configurator;
84 use opendal_core::OperatorUri;
85
86 #[test]
87 fn from_uri_extracts_bucket_and_root() {
88 let uri = OperatorUri::new(
89 "obs://example-bucket/path/to/root",
90 Vec::<(String, String)>::new(),
91 )
92 .unwrap();
93 let cfg = ObsConfig::from_uri(&uri).unwrap();
94 assert_eq!(cfg.bucket.as_deref(), Some("example-bucket"));
95 assert_eq!(cfg.root.as_deref(), Some("path/to/root"));
96 }
97}