opendal_service_pcloud/
config.rs1use std::fmt::Debug;
19
20use opendal_core::*;
21use serde::Deserialize;
22use serde::Serialize;
23
24use super::backend::PcloudBuilder;
25
26#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
28#[serde(default)]
29#[non_exhaustive]
30pub struct PcloudConfig {
31 pub root: Option<String>,
35 pub endpoint: String,
37 pub username: Option<String>,
39 pub password: Option<String>,
41}
42
43impl Debug for PcloudConfig {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 f.debug_struct("PcloudConfig")
46 .field("root", &self.root)
47 .field("endpoint", &self.endpoint)
48 .field("username", &self.username)
49 .finish_non_exhaustive()
50 }
51}
52
53impl Configurator for PcloudConfig {
54 type Builder = PcloudBuilder;
55
56 fn from_uri(uri: &OperatorUri) -> Result<Self> {
57 let mut map = uri.options().clone();
58 if let Some(authority) = uri.authority() {
59 map.insert("endpoint".to_string(), format!("https://{authority}"));
60 }
61
62 if let Some(root) = uri.root()
63 && !root.is_empty()
64 {
65 map.insert("root".to_string(), root.to_string());
66 }
67
68 Self::from_iter(map)
69 }
70
71 fn into_builder(self) -> Self::Builder {
72 PcloudBuilder { config: self }
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn from_uri_sets_endpoint_and_root() -> Result<()> {
82 let uri = OperatorUri::new(
83 "pcloud://api.pcloud.com/drive/photos",
84 vec![("username".to_string(), "alice".to_string())],
85 )?;
86
87 let cfg = PcloudConfig::from_uri(&uri)?;
88 assert_eq!(cfg.endpoint, "https://api.pcloud.com".to_string());
89 assert_eq!(cfg.root.as_deref(), Some("drive/photos"));
90 assert_eq!(cfg.username.as_deref(), Some("alice"));
91 Ok(())
92 }
93
94 #[test]
95 fn from_uri_allows_missing_authority() -> Result<()> {
96 let uri = OperatorUri::new("pcloud", Vec::<(String, String)>::new())?;
97
98 let cfg = PcloudConfig::from_uri(&uri)?;
99 assert!(cfg.endpoint.is_empty());
100 Ok(())
101 }
102}