opendal/services/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 pub enable_versioning: bool,
42}
43
44impl Debug for ObsConfig {
45 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46 f.debug_struct("ObsConfig")
47 .field("root", &self.root)
48 .field("endpoint", &self.endpoint)
49 .field("bucket", &self.bucket)
50 .field("enable_versioning", &self.enable_versioning)
51 .finish_non_exhaustive()
52 }
53}
54
55impl crate::Configurator for ObsConfig {
56 type Builder = ObsBuilder;
57
58 fn from_uri(uri: &crate::types::OperatorUri) -> crate::Result<Self> {
59 let mut map = uri.options().clone();
60
61 if let Some(name) = uri.name() {
62 map.insert("bucket".to_string(), name.to_string());
63 }
64
65 if let Some(root) = uri.root() {
66 map.insert("root".to_string(), root.to_string());
67 }
68
69 Self::from_iter(map)
70 }
71
72 #[allow(deprecated)]
73 fn into_builder(self) -> Self::Builder {
74 ObsBuilder {
75 config: self,
76
77 http_client: None,
78 }
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85 use crate::Configurator;
86 use crate::types::OperatorUri;
87
88 #[test]
89 fn from_uri_extracts_bucket_and_root() {
90 let uri = OperatorUri::new(
91 "obs://example-bucket/path/to/root",
92 Vec::<(String, String)>::new(),
93 )
94 .unwrap();
95 let cfg = ObsConfig::from_uri(&uri).unwrap();
96 assert_eq!(cfg.bucket.as_deref(), Some("example-bucket"));
97 assert_eq!(cfg.root.as_deref(), Some("path/to/root"));
98 }
99}