This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 62a942ca12 feat(services/sled): add SledConfig (#4351)
62a942ca12 is described below

commit 62a942ca1273a9c67ef9938f507aec4de1e25a71
Author: wangyufan <[email protected]>
AuthorDate: Wed Mar 13 01:07:57 2024 +0800

    feat(services/sled): add SledConfig (#4351)
---
 core/src/services/mod.rs          |  2 ++
 core/src/services/sled/backend.rs | 65 +++++++++++++++++++++++++++------------
 core/src/services/sled/mod.rs     |  1 +
 3 files changed, 48 insertions(+), 20 deletions(-)

diff --git a/core/src/services/mod.rs b/core/src/services/mod.rs
index e98245e124..d9d2917cd2 100644
--- a/core/src/services/mod.rs
+++ b/core/src/services/mod.rs
@@ -201,6 +201,8 @@ pub use sftp::SftpConfig;
 mod sled;
 #[cfg(feature = "services-sled")]
 pub use self::sled::Sled;
+#[cfg(feature = "services-sled")]
+pub use self::sled::SledConfig;
 
 #[cfg(feature = "services-supabase")]
 mod supabase;
diff --git a/core/src/services/sled/backend.rs 
b/core/src/services/sled/backend.rs
index 2e87bd608e..74f845eccb 100644
--- a/core/src/services/sled/backend.rs
+++ b/core/src/services/sled/backend.rs
@@ -21,6 +21,7 @@ use std::fmt::Formatter;
 use std::str;
 
 use async_trait::async_trait;
+use serde::Deserialize;
 use tokio::task;
 
 use crate::raw::adapters::kv;
@@ -34,32 +35,58 @@ use crate::*;
 // 
https://github.com/spacejam/sled/blob/69294e59c718289ab3cb6bd03ac3b9e1e072a1e7/src/db.rs#L5
 const DEFAULT_TREE_ID: &str = r#"__sled__default"#;
 
-/// Sled service support.
-#[doc = include_str!("docs.md")]
-#[derive(Default)]
-pub struct SledBuilder {
+/// Config for Sled services support.
+#[derive(Default, Deserialize)]
+#[serde(default)]
+#[non_exhaustive]
+pub struct SledConfig {
     /// That path to the sled data directory.
     datadir: Option<String>,
     root: Option<String>,
     tree: Option<String>,
 }
 
+impl Debug for SledConfig {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("SledConfig")
+            .field("datadir", &self.datadir)
+            .field("root", &self.root)
+            .field("tree", &self.tree)
+            .finish()
+    }
+}
+
+/// Sled services support.
+#[doc = include_str!("docs.md")]
+#[derive(Default)]
+pub struct SledBuilder {
+    config: SledConfig,
+}
+
+impl Debug for SledBuilder {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("SledBuilder")
+            .field("config", &self.config)
+            .finish()
+    }
+}
+
 impl SledBuilder {
     /// Set the path to the sled data directory. Will create if not exists.
     pub fn datadir(&mut self, path: &str) -> &mut Self {
-        self.datadir = Some(path.into());
+        self.config.datadir = Some(path.into());
         self
     }
 
     /// Set the root for sled.
     pub fn root(&mut self, path: &str) -> &mut Self {
-        self.root = Some(path.into());
+        self.config.root = Some(path.into());
         self
     }
 
     /// Set the tree for sled.
     pub fn tree(&mut self, tree: &str) -> &mut Self {
-        self.tree = Some(tree.into());
+        self.config.tree = Some(tree.into());
         self
     }
 }
@@ -69,17 +96,14 @@ impl Builder for SledBuilder {
     type Accessor = SledBackend;
 
     fn from_map(map: HashMap<String, String>) -> Self {
-        let mut builder = SledBuilder::default();
-
-        map.get("datadir").map(|v| builder.datadir(v));
-        map.get("root").map(|v| builder.root(v));
-        map.get("tree").map(|v| builder.tree(v));
-
-        builder
+        SledBuilder {
+            config: SledConfig::deserialize(ConfigDeserializer::new(map))
+                .expect("config deserialize must succeed"),
+        }
     }
 
     fn build(&mut self) -> Result<Self::Accessor> {
-        let datadir_path = self.datadir.take().ok_or_else(|| {
+        let datadir_path = self.config.datadir.take().ok_or_else(|| {
             Error::new(ErrorKind::ConfigInvalid, "datadir is required but not 
set")
                 .with_context("service", Scheme::Sled)
         })?;
@@ -92,10 +116,11 @@ impl Builder for SledBuilder {
         })?;
 
         // use "default" tree if not set
-        let tree_name = match self.tree.take() {
-            Some(tree) => tree,
-            None => DEFAULT_TREE_ID.to_string(),
-        };
+        let tree_name = self
+            .config
+            .tree
+            .take()
+            .unwrap_or_else(|| DEFAULT_TREE_ID.to_string());
 
         let tree = db.open_tree(&tree_name).map_err(|e| {
             Error::new(ErrorKind::ConfigInvalid, "open tree")
@@ -109,7 +134,7 @@ impl Builder for SledBuilder {
             datadir: datadir_path,
             tree,
         })
-        .with_root(self.root.as_deref().unwrap_or_default()))
+        .with_root(self.config.root.as_deref().unwrap_or_default()))
     }
 }
 
diff --git a/core/src/services/sled/mod.rs b/core/src/services/sled/mod.rs
index 57dc753554..af28a3e9b2 100644
--- a/core/src/services/sled/mod.rs
+++ b/core/src/services/sled/mod.rs
@@ -18,3 +18,4 @@
 mod backend;
 
 pub use backend::SledBuilder as Sled;
+pub use backend::SledConfig;

Reply via email to