opendal_service_onedrive/
config.rs1use std::fmt::Debug;
19
20use opendal_core::{Configurator, OperatorUri, Result};
21use serde::Deserialize;
22use serde::Serialize;
23
24use super::backend::OnedriveBuilder;
25
26#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
28#[serde(default)]
29#[non_exhaustive]
30pub struct OnedriveConfig {
31 pub root: Option<String>,
33 pub access_token: Option<String>,
35 pub refresh_token: Option<String>,
37 pub client_id: Option<String>,
39 pub client_secret: Option<String>,
41 #[deprecated(
43 since = "0.57.0",
44 note = "OneDrive versioning capability is enabled by default and this option is no longer needed."
45 )]
46 pub enable_versioning: bool,
47}
48
49impl Debug for OnedriveConfig {
50 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
51 f.debug_struct("OnedriveConfig")
52 .field("root", &self.root)
53 .finish_non_exhaustive()
54 }
55}
56
57impl Configurator for OnedriveConfig {
58 type Builder = OnedriveBuilder;
59
60 fn from_uri(uri: &OperatorUri) -> Result<Self> {
61 let mut map = uri.options().clone();
62
63 if let Some(root) = uri.root()
64 && !root.is_empty()
65 {
66 let normalized = match root.split_once('/') {
67 Some((_, rest)) if !rest.is_empty() => rest.to_string(),
68 _ => root.to_string(),
69 };
70 if !normalized.is_empty() {
71 map.insert("root".to_string(), normalized);
72 }
73 }
74
75 Self::from_iter(map)
76 }
77
78 fn into_builder(self) -> Self::Builder {
79 OnedriveBuilder { config: self }
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86 use opendal_core::Configurator;
87 use opendal_core::OperatorUri;
88
89 #[test]
90 fn from_uri_sets_root() {
91 let uri = OperatorUri::new(
92 "onedrive://drive/root/documents",
93 Vec::<(String, String)>::new(),
94 )
95 .unwrap();
96
97 let cfg = OnedriveConfig::from_uri(&uri).unwrap();
98 assert_eq!(cfg.root.as_deref(), Some("documents"));
99 }
100}