You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2024/08/06 07:50:36 UTC

(opendal) 01/01: refactor(core)!: Return associated builder instead

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

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

commit 07a280454f4933acae657454c5cb92bcbe48c4cb
Author: Xuanwo <gi...@xuanwo.io>
AuthorDate: Tue Aug 6 15:50:14 2024 +0800

    refactor(core)!: Return associated builder instead
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
---
 core/src/docs/upgrade.md                      |  3 ++-
 core/src/services/aliyun_drive/backend.rs     |  3 ++-
 core/src/services/alluxio/backend.rs          |  3 ++-
 core/src/services/atomicserver/backend.rs     |  3 ++-
 core/src/services/azblob/backend.rs           |  3 ++-
 core/src/services/azdls/backend.rs            |  3 ++-
 core/src/services/azfile/backend.rs           |  3 ++-
 core/src/services/b2/backend.rs               |  3 ++-
 core/src/services/cacache/backend.rs          |  3 ++-
 core/src/services/chainsafe/backend.rs        |  3 ++-
 core/src/services/cloudflare_kv/backend.rs    |  3 ++-
 core/src/services/compfs/backend.rs           |  3 ++-
 core/src/services/cos/backend.rs              |  3 ++-
 core/src/services/d1/backend.rs               |  3 ++-
 core/src/services/dashmap/backend.rs          |  3 ++-
 core/src/services/dbfs/backend.rs             |  3 ++-
 core/src/services/dropbox/builder.rs          |  3 ++-
 core/src/services/etcd/backend.rs             |  3 ++-
 core/src/services/foundationdb/backend.rs     | 13 +++++-----
 core/src/services/foundationdb/mod.rs         |  2 +-
 core/src/services/fs/backend.rs               |  3 ++-
 core/src/services/ftp/backend.rs              |  3 ++-
 core/src/services/gcs/backend.rs              |  3 ++-
 core/src/services/gdrive/builder.rs           |  3 ++-
 core/src/services/ghac/backend.rs             |  3 ++-
 core/src/services/github/backend.rs           |  3 ++-
 core/src/services/gridfs/backend.rs           |  3 ++-
 core/src/services/hdfs/backend.rs             |  3 ++-
 core/src/services/hdfs_native/backend.rs      |  3 ++-
 core/src/services/http/backend.rs             |  3 ++-
 core/src/services/huggingface/backend.rs      |  3 ++-
 core/src/services/icloud/backend.rs           |  3 ++-
 core/src/services/ipfs/backend.rs             |  3 ++-
 core/src/services/ipmfs/builder.rs            |  3 ++-
 core/src/services/koofr/backend.rs            |  3 ++-
 core/src/services/libsql/backend.rs           |  3 ++-
 core/src/services/memcached/backend.rs        |  3 ++-
 core/src/services/memory/backend.rs           |  3 ++-
 core/src/services/mini_moka/backend.rs        |  3 ++-
 core/src/services/mod.rs                      |  4 +--
 core/src/services/moka/backend.rs             |  3 ++-
 core/src/services/mongodb/backend.rs          |  3 ++-
 core/src/services/monoiofs/backend.rs         |  3 ++-
 core/src/services/mysql/backend.rs            |  3 ++-
 core/src/services/obs/backend.rs              |  3 ++-
 core/src/services/onedrive/builder.rs         |  3 ++-
 core/src/services/oss/backend.rs              |  3 ++-
 core/src/services/pcloud/backend.rs           |  3 ++-
 core/src/services/persy/backend.rs            |  3 ++-
 core/src/services/postgresql/backend.rs       |  3 ++-
 core/src/services/redb/backend.rs             |  3 ++-
 core/src/services/redis/backend.rs            |  3 ++-
 core/src/services/rocksdb/backend.rs          |  3 ++-
 core/src/services/s3/backend.rs               |  3 ++-
 core/src/services/seafile/backend.rs          |  3 ++-
 core/src/services/sftp/backend.rs             |  3 ++-
 core/src/services/sled/backend.rs             |  3 ++-
 core/src/services/sqlite/backend.rs           |  3 ++-
 core/src/services/supabase/backend.rs         |  3 ++-
 core/src/services/surrealdb/backend.rs        |  3 ++-
 core/src/services/swift/backend.rs            |  3 ++-
 core/src/services/tikv/backend.rs             |  3 ++-
 core/src/services/upyun/backend.rs            |  3 ++-
 core/src/services/vercel_artifacts/builder.rs |  3 ++-
 core/src/services/vercel_blob/backend.rs      |  3 ++-
 core/src/services/webdav/backend.rs           |  3 ++-
 core/src/services/webhdfs/backend.rs          |  3 ++-
 core/src/services/yandex_disk/backend.rs      |  3 ++-
 core/src/types/builder.rs                     | 35 +++++++++++++++++++++++++--
 69 files changed, 173 insertions(+), 76 deletions(-)

diff --git a/core/src/docs/upgrade.md b/core/src/docs/upgrade.md
index cf6a479fd6..8963902657 100644
--- a/core/src/docs/upgrade.md
+++ b/core/src/docs/upgrade.md
@@ -86,7 +86,8 @@ Service implementers should update their code to use the `Configurator` trait in
 
 ```rust
 impl Configurator for MemoryConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MemoryBuilder;
+    fn into_builder(self) -> Self::Builder {
         MemoryBuilder { config: self }
     }
 }
diff --git a/core/src/services/aliyun_drive/backend.rs b/core/src/services/aliyun_drive/backend.rs
index 77ed6ac40b..7dc5ba5c21 100644
--- a/core/src/services/aliyun_drive/backend.rs
+++ b/core/src/services/aliyun_drive/backend.rs
@@ -89,7 +89,8 @@ impl Debug for AliyunDriveConfig {
 }
 
 impl Configurator for AliyunDriveConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = AliyunDriveBuilder;
+    fn into_builder(self) -> Self::Builder {
         AliyunDriveBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/alluxio/backend.rs b/core/src/services/alluxio/backend.rs
index 6d9aec73a1..bd998430b1 100644
--- a/core/src/services/alluxio/backend.rs
+++ b/core/src/services/alluxio/backend.rs
@@ -61,7 +61,8 @@ impl Debug for AlluxioConfig {
 }
 
 impl Configurator for AlluxioConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = AlluxioBuilder;
+    fn into_builder(self) -> Self::Builder {
         AlluxioBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/atomicserver/backend.rs b/core/src/services/atomicserver/backend.rs
index 5812b41d38..eb61f61283 100644
--- a/core/src/services/atomicserver/backend.rs
+++ b/core/src/services/atomicserver/backend.rs
@@ -63,7 +63,8 @@ impl Debug for AtomicserverConfig {
 }
 
 impl Configurator for AtomicserverConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = AtomicserverBuilder;
+    fn into_builder(self) -> Self::Builder {
         AtomicserverBuilder { config: self }
     }
 }
diff --git a/core/src/services/azblob/backend.rs b/core/src/services/azblob/backend.rs
index 3c907d397f..d97f5b8405 100644
--- a/core/src/services/azblob/backend.rs
+++ b/core/src/services/azblob/backend.rs
@@ -119,7 +119,8 @@ impl Debug for AzblobConfig {
 }
 
 impl Configurator for AzblobConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = AzblobBuilder;
+    fn into_builder(self) -> Self::Builder {
         AzblobBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/azdls/backend.rs b/core/src/services/azdls/backend.rs
index b4489b557e..baa68ae14f 100644
--- a/core/src/services/azdls/backend.rs
+++ b/core/src/services/azdls/backend.rs
@@ -81,7 +81,8 @@ impl Debug for AzdlsConfig {
 }
 
 impl Configurator for AzdlsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = AzdlsBuilder;
+    fn into_builder(self) -> Self::Builder {
         AzdlsBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/azfile/backend.rs b/core/src/services/azfile/backend.rs
index 4fe74c9fcb..5390e02556 100644
--- a/core/src/services/azfile/backend.rs
+++ b/core/src/services/azfile/backend.rs
@@ -79,7 +79,8 @@ impl Debug for AzfileConfig {
 }
 
 impl Configurator for AzfileConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = AzfileBuilder;
+    fn into_builder(self) -> Self::Builder {
         AzfileBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/b2/backend.rs b/core/src/services/b2/backend.rs
index 2a7de8922f..18fb45d53d 100644
--- a/core/src/services/b2/backend.rs
+++ b/core/src/services/b2/backend.rs
@@ -83,7 +83,8 @@ impl Debug for B2Config {
 }
 
 impl Configurator for B2Config {
-    fn into_builder(self) -> impl Builder {
+    type Builder = B2Builder;
+    fn into_builder(self) -> Self::Builder {
         B2Builder {
             config: self,
             http_client: None,
diff --git a/core/src/services/cacache/backend.rs b/core/src/services/cacache/backend.rs
index 5e1d6112ff..977127f9ca 100644
--- a/core/src/services/cacache/backend.rs
+++ b/core/src/services/cacache/backend.rs
@@ -39,7 +39,8 @@ pub struct CacacheConfig {
 }
 
 impl Configurator for CacacheConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = CacacheBuilder;
+    fn into_builder(self) -> Self::Builder {
         CacacheBuilder { config: self }
     }
 }
diff --git a/core/src/services/chainsafe/backend.rs b/core/src/services/chainsafe/backend.rs
index 2431d0e261..88640c578d 100644
--- a/core/src/services/chainsafe/backend.rs
+++ b/core/src/services/chainsafe/backend.rs
@@ -65,7 +65,8 @@ impl Debug for ChainsafeConfig {
 }
 
 impl Configurator for ChainsafeConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = ChainsafeBuilder;
+    fn into_builder(self) -> Self::Builder {
         ChainsafeBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/cloudflare_kv/backend.rs b/core/src/services/cloudflare_kv/backend.rs
index 0ce628e507..7184ce0e9e 100644
--- a/core/src/services/cloudflare_kv/backend.rs
+++ b/core/src/services/cloudflare_kv/backend.rs
@@ -62,7 +62,8 @@ impl Debug for CloudflareKvConfig {
 }
 
 impl Configurator for CloudflareKvConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = CloudflareKvBuilder;
+    fn into_builder(self) -> Self::Builder {
         CloudflareKvBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/compfs/backend.rs b/core/src/services/compfs/backend.rs
index d2fa7f5d20..f866ccec07 100644
--- a/core/src/services/compfs/backend.rs
+++ b/core/src/services/compfs/backend.rs
@@ -40,7 +40,8 @@ pub struct CompfsConfig {
 }
 
 impl Configurator for CompfsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = CompfsBuilder;
+    fn into_builder(self) -> Self::Builder {
         CompfsBuilder { config: self }
     }
 }
diff --git a/core/src/services/cos/backend.rs b/core/src/services/cos/backend.rs
index d94201490e..a900aba741 100644
--- a/core/src/services/cos/backend.rs
+++ b/core/src/services/cos/backend.rs
@@ -67,7 +67,8 @@ impl Debug for CosConfig {
 }
 
 impl Configurator for CosConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = CosBuilder;
+    fn into_builder(self) -> Self::Builder {
         CosBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/d1/backend.rs b/core/src/services/d1/backend.rs
index ae0fb132ed..e6aaa6da4e 100644
--- a/core/src/services/d1/backend.rs
+++ b/core/src/services/d1/backend.rs
@@ -67,7 +67,8 @@ impl Debug for D1Config {
 }
 
 impl Configurator for D1Config {
-    fn into_builder(self) -> impl Builder {
+    type Builder = D1Builder;
+    fn into_builder(self) -> Self::Builder {
         D1Builder {
             config: self,
             http_client: None,
diff --git a/core/src/services/dashmap/backend.rs b/core/src/services/dashmap/backend.rs
index 8b4d8d728c..ac359ee4c4 100644
--- a/core/src/services/dashmap/backend.rs
+++ b/core/src/services/dashmap/backend.rs
@@ -34,7 +34,8 @@ pub struct DashmapConfig {
 }
 
 impl Configurator for DashmapConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = DashmapBuilder;
+    fn into_builder(self) -> Self::Builder {
         DashmapBuilder { config: self }
     }
 }
diff --git a/core/src/services/dbfs/backend.rs b/core/src/services/dbfs/backend.rs
index 4673ceb4e0..542722a3e0 100644
--- a/core/src/services/dbfs/backend.rs
+++ b/core/src/services/dbfs/backend.rs
@@ -59,7 +59,8 @@ impl Debug for DbfsConfig {
 }
 
 impl Configurator for DbfsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = DbfsBuilder;
+    fn into_builder(self) -> Self::Builder {
         DbfsBuilder { config: self }
     }
 }
diff --git a/core/src/services/dropbox/builder.rs b/core/src/services/dropbox/builder.rs
index 29ee07a852..bef4e2421e 100644
--- a/core/src/services/dropbox/builder.rs
+++ b/core/src/services/dropbox/builder.rs
@@ -57,7 +57,8 @@ impl Debug for DropboxConfig {
 }
 
 impl Configurator for DropboxConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = DropboxBuilder;
+    fn into_builder(self) -> Self::Builder {
         DropboxBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/etcd/backend.rs b/core/src/services/etcd/backend.rs
index 90eee72566..3344a951cf 100644
--- a/core/src/services/etcd/backend.rs
+++ b/core/src/services/etcd/backend.rs
@@ -102,7 +102,8 @@ impl Debug for EtcdConfig {
 }
 
 impl Configurator for EtcdConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = EtcdBuilder;
+    fn into_builder(self) -> Self::Builder {
         EtcdBuilder { config: self }
     }
 }
diff --git a/core/src/services/foundationdb/backend.rs b/core/src/services/foundationdb/backend.rs
index 34fbe5f5be..2a83bffdeb 100644
--- a/core/src/services/foundationdb/backend.rs
+++ b/core/src/services/foundationdb/backend.rs
@@ -37,14 +37,14 @@ use crate::*;
 #[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
 #[serde(default)]
 #[non_exhaustive]
-pub struct FoundationConfig {
+pub struct FoundationdbConfig {
     ///root of the backend.
     pub root: Option<String>,
     ///config_path for the backend.
     pub config_path: Option<String>,
 }
 
-impl Debug for FoundationConfig {
+impl Debug for FoundationdbConfig {
     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
         let mut ds = f.debug_struct("FoundationConfig");
 
@@ -55,8 +55,9 @@ impl Debug for FoundationConfig {
     }
 }
 
-impl Configurator for FoundationConfig {
-    fn into_builder(self) -> impl Builder {
+impl Configurator for FoundationdbConfig {
+    type Builder = FoundationdbBuilder;
+    fn into_builder(self) -> Self::Builder {
         FoundationdbBuilder { config: self }
     }
 }
@@ -64,7 +65,7 @@ impl Configurator for FoundationConfig {
 #[doc = include_str!("docs.md")]
 #[derive(Default)]
 pub struct FoundationdbBuilder {
-    config: FoundationConfig,
+    config: FoundationdbConfig,
 }
 
 impl FoundationdbBuilder {
@@ -83,7 +84,7 @@ impl FoundationdbBuilder {
 
 impl Builder for FoundationdbBuilder {
     const SCHEME: Scheme = Scheme::Foundationdb;
-    type Config = FoundationConfig;
+    type Config = FoundationdbConfig;
 
     fn build(self) -> Result<impl Access> {
         let _network = Arc::new(unsafe { foundationdb::boot() });
diff --git a/core/src/services/foundationdb/mod.rs b/core/src/services/foundationdb/mod.rs
index 10d196dff7..a761e25a47 100644
--- a/core/src/services/foundationdb/mod.rs
+++ b/core/src/services/foundationdb/mod.rs
@@ -17,5 +17,5 @@
 
 mod backend;
 
-pub use backend::FoundationConfig;
 pub use backend::FoundationdbBuilder as Foundationdb;
+pub use backend::FoundationdbConfig;
diff --git a/core/src/services/fs/backend.rs b/core/src/services/fs/backend.rs
index 0559fa7c57..93bdd445ad 100644
--- a/core/src/services/fs/backend.rs
+++ b/core/src/services/fs/backend.rs
@@ -46,7 +46,8 @@ pub struct FsConfig {
 }
 
 impl Configurator for FsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = FsBuilder;
+    fn into_builder(self) -> Self::Builder {
         FsBuilder { config: self }
     }
 }
diff --git a/core/src/services/ftp/backend.rs b/core/src/services/ftp/backend.rs
index c277cfac7b..1d5cb84b03 100644
--- a/core/src/services/ftp/backend.rs
+++ b/core/src/services/ftp/backend.rs
@@ -71,7 +71,8 @@ impl Debug for FtpConfig {
 }
 
 impl Configurator for FtpConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = FtpBuilder;
+    fn into_builder(self) -> Self::Builder {
         FtpBuilder { config: self }
     }
 }
diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs
index afeb38653d..d00c740ea8 100644
--- a/core/src/services/gcs/backend.rs
+++ b/core/src/services/gcs/backend.rs
@@ -80,7 +80,8 @@ impl Debug for GcsConfig {
 }
 
 impl Configurator for GcsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = GcsBuilder;
+    fn into_builder(self) -> Self::Builder {
         GcsBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/gdrive/builder.rs b/core/src/services/gdrive/builder.rs
index 07e1128e66..fc3b9b8385 100644
--- a/core/src/services/gdrive/builder.rs
+++ b/core/src/services/gdrive/builder.rs
@@ -63,7 +63,8 @@ impl Debug for GdriveConfig {
 }
 
 impl Configurator for GdriveConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = GdriveBuilder;
+    fn into_builder(self) -> Self::Builder {
         GdriveBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/ghac/backend.rs b/core/src/services/ghac/backend.rs
index 7333f92184..4698de168f 100644
--- a/core/src/services/ghac/backend.rs
+++ b/core/src/services/ghac/backend.rs
@@ -97,7 +97,8 @@ pub struct GhacConfig {
 }
 
 impl Configurator for GhacConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = GhacBuilder;
+    fn into_builder(self) -> Self::Builder {
         GhacBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/github/backend.rs b/core/src/services/github/backend.rs
index b45fefe983..f33bd0554a 100644
--- a/core/src/services/github/backend.rs
+++ b/core/src/services/github/backend.rs
@@ -73,7 +73,8 @@ impl Debug for GithubConfig {
 }
 
 impl Configurator for GithubConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = GithubBuilder;
+    fn into_builder(self) -> Self::Builder {
         GithubBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/gridfs/backend.rs b/core/src/services/gridfs/backend.rs
index a0396f2279..6c36776fa4 100644
--- a/core/src/services/gridfs/backend.rs
+++ b/core/src/services/gridfs/backend.rs
@@ -62,7 +62,8 @@ impl Debug for GridFsConfig {
 }
 
 impl Configurator for GridFsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = GridFsBuilder;
+    fn into_builder(self) -> Self::Builder {
         GridFsBuilder { config: self }
     }
 }
diff --git a/core/src/services/hdfs/backend.rs b/core/src/services/hdfs/backend.rs
index 857bd6a710..ff240c248c 100644
--- a/core/src/services/hdfs/backend.rs
+++ b/core/src/services/hdfs/backend.rs
@@ -72,7 +72,8 @@ impl Debug for HdfsConfig {
 }
 
 impl Configurator for HdfsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = HdfsBuilder;
+    fn into_builder(self) -> Self::Builder {
         HdfsBuilder { config: self }
     }
 }
diff --git a/core/src/services/hdfs_native/backend.rs b/core/src/services/hdfs_native/backend.rs
index de7d830a8e..d8c9edc3cf 100644
--- a/core/src/services/hdfs_native/backend.rs
+++ b/core/src/services/hdfs_native/backend.rs
@@ -59,7 +59,8 @@ impl Debug for HdfsNativeConfig {
 }
 
 impl Configurator for HdfsNativeConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = HdfsNativeBuilder;
+    fn into_builder(self) -> Self::Builder {
         HdfsNativeBuilder { config: self }
     }
 }
diff --git a/core/src/services/http/backend.rs b/core/src/services/http/backend.rs
index dfd6efd140..7256616621 100644
--- a/core/src/services/http/backend.rs
+++ b/core/src/services/http/backend.rs
@@ -61,7 +61,8 @@ impl Debug for HttpConfig {
 }
 
 impl Configurator for HttpConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = HttpBuilder;
+    fn into_builder(self) -> Self::Builder {
         HttpBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/huggingface/backend.rs b/core/src/services/huggingface/backend.rs
index 5b025197d7..712c895edf 100644
--- a/core/src/services/huggingface/backend.rs
+++ b/core/src/services/huggingface/backend.rs
@@ -87,7 +87,8 @@ impl Debug for HuggingfaceConfig {
 }
 
 impl Configurator for HuggingfaceConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = HuggingfaceBuilder;
+    fn into_builder(self) -> Self::Builder {
         HuggingfaceBuilder { config: self }
     }
 }
diff --git a/core/src/services/icloud/backend.rs b/core/src/services/icloud/backend.rs
index 37b8146c7a..583d61a0f0 100644
--- a/core/src/services/icloud/backend.rs
+++ b/core/src/services/icloud/backend.rs
@@ -72,7 +72,8 @@ impl Debug for IcloudConfig {
 }
 
 impl Configurator for IcloudConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = IcloudBuilder;
+    fn into_builder(self) -> Self::Builder {
         IcloudBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/ipfs/backend.rs b/core/src/services/ipfs/backend.rs
index b9ffda9791..3eeda15b97 100644
--- a/core/src/services/ipfs/backend.rs
+++ b/core/src/services/ipfs/backend.rs
@@ -44,7 +44,8 @@ pub struct IpfsConfig {
 }
 
 impl Configurator for IpfsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = IpfsBuilder;
+    fn into_builder(self) -> Self::Builder {
         IpfsBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/ipmfs/builder.rs b/core/src/services/ipmfs/builder.rs
index ab6f150ae3..9704888215 100644
--- a/core/src/services/ipmfs/builder.rs
+++ b/core/src/services/ipmfs/builder.rs
@@ -35,7 +35,8 @@ pub struct IpmfsConfig {
 }
 
 impl Configurator for IpmfsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = IpmfsBuilder;
+    fn into_builder(self) -> Self::Builder {
         IpmfsBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/koofr/backend.rs b/core/src/services/koofr/backend.rs
index 71728c15ef..7809e35eae 100644
--- a/core/src/services/koofr/backend.rs
+++ b/core/src/services/koofr/backend.rs
@@ -67,7 +67,8 @@ impl Debug for KoofrConfig {
 }
 
 impl Configurator for KoofrConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = KoofrBuilder;
+    fn into_builder(self) -> Self::Builder {
         KoofrBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/libsql/backend.rs b/core/src/services/libsql/backend.rs
index 8cf007902e..70bdfb9219 100644
--- a/core/src/services/libsql/backend.rs
+++ b/core/src/services/libsql/backend.rs
@@ -81,7 +81,8 @@ impl Debug for LibsqlConfig {
 }
 
 impl Configurator for LibsqlConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = LibsqlBuilder;
+    fn into_builder(self) -> Self::Builder {
         LibsqlBuilder { config: self }
     }
 }
diff --git a/core/src/services/memcached/backend.rs b/core/src/services/memcached/backend.rs
index ccdbaabb8d..4f516bfc82 100644
--- a/core/src/services/memcached/backend.rs
+++ b/core/src/services/memcached/backend.rs
@@ -50,7 +50,8 @@ pub struct MemcachedConfig {
 }
 
 impl Configurator for MemcachedConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MemcachedBuilder;
+    fn into_builder(self) -> Self::Builder {
         MemcachedBuilder { config: self }
     }
 }
diff --git a/core/src/services/memory/backend.rs b/core/src/services/memory/backend.rs
index ed14c74a15..ef7ca83760 100644
--- a/core/src/services/memory/backend.rs
+++ b/core/src/services/memory/backend.rs
@@ -37,7 +37,8 @@ pub struct MemoryConfig {
 }
 
 impl Configurator for MemoryConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MemoryBuilder;
+    fn into_builder(self) -> Self::Builder {
         MemoryBuilder { config: self }
     }
 }
diff --git a/core/src/services/mini_moka/backend.rs b/core/src/services/mini_moka/backend.rs
index 9cb0a1773b..6373d157f9 100644
--- a/core/src/services/mini_moka/backend.rs
+++ b/core/src/services/mini_moka/backend.rs
@@ -48,7 +48,8 @@ pub struct MiniMokaConfig {
 }
 
 impl Configurator for MiniMokaConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MiniMokaBuilder;
+    fn into_builder(self) -> Self::Builder {
         MiniMokaBuilder { config: self }
     }
 }
diff --git a/core/src/services/mod.rs b/core/src/services/mod.rs
index bc7c9de65e..10e9aa7f2e 100644
--- a/core/src/services/mod.rs
+++ b/core/src/services/mod.rs
@@ -316,9 +316,9 @@ pub use self::tikv::TikvConfig;
 #[cfg(feature = "services-foundationdb")]
 mod foundationdb;
 #[cfg(feature = "services-foundationdb")]
-pub use self::foundationdb::FoundationConfig;
-#[cfg(feature = "services-foundationdb")]
 pub use self::foundationdb::Foundationdb;
+#[cfg(feature = "services-foundationdb")]
+pub use self::foundationdb::FoundationdbConfig;
 
 #[cfg(feature = "services-postgresql")]
 mod postgresql;
diff --git a/core/src/services/moka/backend.rs b/core/src/services/moka/backend.rs
index 7ad68a1760..13e8fc7302 100644
--- a/core/src/services/moka/backend.rs
+++ b/core/src/services/moka/backend.rs
@@ -67,7 +67,8 @@ impl Debug for MokaConfig {
 }
 
 impl Configurator for MokaConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MokaBuilder;
+    fn into_builder(self) -> Self::Builder {
         MokaBuilder { config: self }
     }
 }
diff --git a/core/src/services/mongodb/backend.rs b/core/src/services/mongodb/backend.rs
index 05e767902c..d700b08d38 100644
--- a/core/src/services/mongodb/backend.rs
+++ b/core/src/services/mongodb/backend.rs
@@ -63,7 +63,8 @@ impl Debug for MongodbConfig {
 }
 
 impl Configurator for MongodbConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MongodbBuilder;
+    fn into_builder(self) -> Self::Builder {
         MongodbBuilder { config: self }
     }
 }
diff --git a/core/src/services/monoiofs/backend.rs b/core/src/services/monoiofs/backend.rs
index e050269330..579d932867 100644
--- a/core/src/services/monoiofs/backend.rs
+++ b/core/src/services/monoiofs/backend.rs
@@ -41,7 +41,8 @@ pub struct MonoiofsConfig {
 }
 
 impl Configurator for MonoiofsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MonoiofsBuilder;
+    fn into_builder(self) -> Self::Builder {
         MonoiofsBuilder { config: self }
     }
 }
diff --git a/core/src/services/mysql/backend.rs b/core/src/services/mysql/backend.rs
index b5e6179c5b..e3bd1f02dc 100644
--- a/core/src/services/mysql/backend.rs
+++ b/core/src/services/mysql/backend.rs
@@ -62,7 +62,8 @@ impl Debug for MysqlConfig {
 }
 
 impl Configurator for MysqlConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = MysqlBuilder;
+    fn into_builder(self) -> Self::Builder {
         MysqlBuilder { config: self }
     }
 }
diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs
index 306ed1734e..071a0cda01 100644
--- a/core/src/services/obs/backend.rs
+++ b/core/src/services/obs/backend.rs
@@ -67,7 +67,8 @@ impl Debug for ObsConfig {
 }
 
 impl Configurator for ObsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = ObsBuilder;
+    fn into_builder(self) -> Self::Builder {
         ObsBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/onedrive/builder.rs b/core/src/services/onedrive/builder.rs
index d2bf3f2534..4f0ae806d6 100644
--- a/core/src/services/onedrive/builder.rs
+++ b/core/src/services/onedrive/builder.rs
@@ -49,7 +49,8 @@ impl Debug for OnedriveConfig {
 }
 
 impl Configurator for OnedriveConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = OnedriveBuilder;
+    fn into_builder(self) -> Self::Builder {
         OnedriveBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs
index a3563bc1dd..b9e3d44a71 100644
--- a/core/src/services/oss/backend.rs
+++ b/core/src/services/oss/backend.rs
@@ -86,7 +86,8 @@ impl Debug for OssConfig {
 }
 
 impl Configurator for OssConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = OssBuilder;
+    fn into_builder(self) -> Self::Builder {
         OssBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/pcloud/backend.rs b/core/src/services/pcloud/backend.rs
index 8afd38e553..a07fdd5472 100644
--- a/core/src/services/pcloud/backend.rs
+++ b/core/src/services/pcloud/backend.rs
@@ -65,7 +65,8 @@ impl Debug for PcloudConfig {
 }
 
 impl Configurator for PcloudConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = PcloudBuilder;
+    fn into_builder(self) -> Self::Builder {
         PcloudBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/persy/backend.rs b/core/src/services/persy/backend.rs
index c285f636e3..7b5c0c1fdd 100644
--- a/core/src/services/persy/backend.rs
+++ b/core/src/services/persy/backend.rs
@@ -46,7 +46,8 @@ pub struct PersyConfig {
 }
 
 impl Configurator for PersyConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = PersyBuilder;
+    fn into_builder(self) -> Self::Builder {
         PersyBuilder { config: self }
     }
 }
diff --git a/core/src/services/postgresql/backend.rs b/core/src/services/postgresql/backend.rs
index 2864cb03ae..fa053562a7 100644
--- a/core/src/services/postgresql/backend.rs
+++ b/core/src/services/postgresql/backend.rs
@@ -69,7 +69,8 @@ impl Debug for PostgresqlConfig {
 }
 
 impl Configurator for PostgresqlConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = PostgresqlBuilder;
+    fn into_builder(self) -> Self::Builder {
         PostgresqlBuilder { config: self }
     }
 }
diff --git a/core/src/services/redb/backend.rs b/core/src/services/redb/backend.rs
index dd049d6629..e4f3d33276 100644
--- a/core/src/services/redb/backend.rs
+++ b/core/src/services/redb/backend.rs
@@ -45,7 +45,8 @@ pub struct RedbConfig {
 }
 
 impl Configurator for RedbConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = RedbBuilder;
+    fn into_builder(self) -> Self::Builder {
         RedbBuilder { config: self }
     }
 }
diff --git a/core/src/services/redis/backend.rs b/core/src/services/redis/backend.rs
index f8460f4c3e..fc45eaa5cb 100644
--- a/core/src/services/redis/backend.rs
+++ b/core/src/services/redis/backend.rs
@@ -99,7 +99,8 @@ impl Debug for RedisConfig {
 }
 
 impl Configurator for RedisConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = RedisBuilder;
+    fn into_builder(self) -> Self::Builder {
         RedisBuilder { config: self }
     }
 }
diff --git a/core/src/services/rocksdb/backend.rs b/core/src/services/rocksdb/backend.rs
index 7ee2e84431..130b785bbd 100644
--- a/core/src/services/rocksdb/backend.rs
+++ b/core/src/services/rocksdb/backend.rs
@@ -43,7 +43,8 @@ pub struct RocksdbConfig {
 }
 
 impl Configurator for RocksdbConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = RocksdbBuilder;
+    fn into_builder(self) -> Self::Builder {
         RocksdbBuilder { config: self }
     }
 }
diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs
index dbb9832114..1bcd4a4bfd 100644
--- a/core/src/services/s3/backend.rs
+++ b/core/src/services/s3/backend.rs
@@ -226,7 +226,8 @@ impl Debug for S3Config {
 }
 
 impl Configurator for S3Config {
-    fn into_builder(self) -> impl Builder {
+    type Builder = S3Builder;
+    fn into_builder(self) -> Self::Builder {
         S3Builder {
             config: self,
             customized_credential_load: None,
diff --git a/core/src/services/seafile/backend.rs b/core/src/services/seafile/backend.rs
index ce214aa077..10b71a1fbe 100644
--- a/core/src/services/seafile/backend.rs
+++ b/core/src/services/seafile/backend.rs
@@ -72,7 +72,8 @@ impl Debug for SeafileConfig {
 }
 
 impl Configurator for SeafileConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SeafileBuilder;
+    fn into_builder(self) -> Self::Builder {
         SeafileBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/sftp/backend.rs b/core/src/services/sftp/backend.rs
index 0a6b95dc11..637164e689 100644
--- a/core/src/services/sftp/backend.rs
+++ b/core/src/services/sftp/backend.rs
@@ -73,7 +73,8 @@ impl Debug for SftpConfig {
 }
 
 impl Configurator for SftpConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SftpBuilder;
+    fn into_builder(self) -> Self::Builder {
         SftpBuilder { config: self }
     }
 }
diff --git a/core/src/services/sled/backend.rs b/core/src/services/sled/backend.rs
index 23b1e80f6a..e04488a15a 100644
--- a/core/src/services/sled/backend.rs
+++ b/core/src/services/sled/backend.rs
@@ -58,7 +58,8 @@ impl Debug for SledConfig {
 }
 
 impl Configurator for SledConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SledBuilder;
+    fn into_builder(self) -> Self::Builder {
         SledBuilder { config: self }
     }
 }
diff --git a/core/src/services/sqlite/backend.rs b/core/src/services/sqlite/backend.rs
index f4878e7165..1229ca2eaa 100644
--- a/core/src/services/sqlite/backend.rs
+++ b/core/src/services/sqlite/backend.rs
@@ -77,7 +77,8 @@ impl Debug for SqliteConfig {
 }
 
 impl Configurator for SqliteConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SqliteBuilder;
+    fn into_builder(self) -> Self::Builder {
         SqliteBuilder { config: self }
     }
 }
diff --git a/core/src/services/supabase/backend.rs b/core/src/services/supabase/backend.rs
index cd8e89cc5e..773ffb381a 100644
--- a/core/src/services/supabase/backend.rs
+++ b/core/src/services/supabase/backend.rs
@@ -56,7 +56,8 @@ impl Debug for SupabaseConfig {
 }
 
 impl Configurator for SupabaseConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SupabaseBuilder;
+    fn into_builder(self) -> Self::Builder {
         SupabaseBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/surrealdb/backend.rs b/core/src/services/surrealdb/backend.rs
index 64c4d5a1c3..b7482f6cdf 100644
--- a/core/src/services/surrealdb/backend.rs
+++ b/core/src/services/surrealdb/backend.rs
@@ -74,7 +74,8 @@ impl Debug for SurrealdbConfig {
 }
 
 impl Configurator for SurrealdbConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SurrealdbBuilder;
+    fn into_builder(self) -> Self::Builder {
         SurrealdbBuilder { config: self }
     }
 }
diff --git a/core/src/services/swift/backend.rs b/core/src/services/swift/backend.rs
index ef94c95d9d..e0170db0b9 100644
--- a/core/src/services/swift/backend.rs
+++ b/core/src/services/swift/backend.rs
@@ -64,7 +64,8 @@ impl Debug for SwiftConfig {
 }
 
 impl Configurator for SwiftConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = SwiftBuilder;
+    fn into_builder(self) -> Self::Builder {
         SwiftBuilder { config: self }
     }
 }
diff --git a/core/src/services/tikv/backend.rs b/core/src/services/tikv/backend.rs
index 49b80bee26..cb113e956e 100644
--- a/core/src/services/tikv/backend.rs
+++ b/core/src/services/tikv/backend.rs
@@ -64,7 +64,8 @@ impl Debug for TikvConfig {
 }
 
 impl Configurator for TikvConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = TikvBuilder;
+    fn into_builder(self) -> Self::Builder {
         TikvBuilder { config: self }
     }
 }
diff --git a/core/src/services/upyun/backend.rs b/core/src/services/upyun/backend.rs
index 67cb900003..1a9c4e0357 100644
--- a/core/src/services/upyun/backend.rs
+++ b/core/src/services/upyun/backend.rs
@@ -63,7 +63,8 @@ impl Debug for UpyunConfig {
 }
 
 impl Configurator for UpyunConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = UpyunBuilder;
+    fn into_builder(self) -> Self::Builder {
         UpyunBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/vercel_artifacts/builder.rs b/core/src/services/vercel_artifacts/builder.rs
index ee41e29e88..8618e49ed2 100644
--- a/core/src/services/vercel_artifacts/builder.rs
+++ b/core/src/services/vercel_artifacts/builder.rs
@@ -45,7 +45,8 @@ impl Debug for VercelArtifactsConfig {
 }
 
 impl Configurator for VercelArtifactsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = VercelArtifactsBuilder;
+    fn into_builder(self) -> Self::Builder {
         VercelArtifactsBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/vercel_blob/backend.rs b/core/src/services/vercel_blob/backend.rs
index 256ef35898..fb308b516f 100644
--- a/core/src/services/vercel_blob/backend.rs
+++ b/core/src/services/vercel_blob/backend.rs
@@ -60,7 +60,8 @@ impl Debug for VercelBlobConfig {
 }
 
 impl Configurator for VercelBlobConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = VercelBlobBuilder;
+    fn into_builder(self) -> Self::Builder {
         VercelBlobBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/webdav/backend.rs b/core/src/services/webdav/backend.rs
index 19212ca054..94c3037362 100644
--- a/core/src/services/webdav/backend.rs
+++ b/core/src/services/webdav/backend.rs
@@ -65,7 +65,8 @@ impl Debug for WebdavConfig {
 }
 
 impl Configurator for WebdavConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = WebdavBuilder;
+    fn into_builder(self) -> Self::Builder {
         WebdavBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/services/webhdfs/backend.rs b/core/src/services/webhdfs/backend.rs
index 7becff2366..2e32b03f7b 100644
--- a/core/src/services/webhdfs/backend.rs
+++ b/core/src/services/webhdfs/backend.rs
@@ -70,7 +70,8 @@ impl Debug for WebhdfsConfig {
 }
 
 impl Configurator for WebhdfsConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = WebhdfsBuilder;
+    fn into_builder(self) -> Self::Builder {
         WebhdfsBuilder { config: self }
     }
 }
diff --git a/core/src/services/yandex_disk/backend.rs b/core/src/services/yandex_disk/backend.rs
index dfc767264f..cbcbc7bca8 100644
--- a/core/src/services/yandex_disk/backend.rs
+++ b/core/src/services/yandex_disk/backend.rs
@@ -60,7 +60,8 @@ impl Debug for YandexDiskConfig {
 }
 
 impl Configurator for YandexDiskConfig {
-    fn into_builder(self) -> impl Builder {
+    type Builder = YandexDiskBuilder;
+    fn into_builder(self) -> Self::Builder {
         YandexDiskBuilder {
             config: self,
             http_client: None,
diff --git a/core/src/types/builder.rs b/core/src/types/builder.rs
index c3ae8ff6ec..287122457c 100644
--- a/core/src/types/builder.rs
+++ b/core/src/types/builder.rs
@@ -94,7 +94,36 @@ impl Builder for () {
 ///     Ok(())
 /// }
 /// ```
+///
+/// Some service builder might contain in memory options like `http_client` . Users can call
+/// `into_builder` to convert the configuration into a builder instead.
+///
+/// ```
+/// # use anyhow::Result;
+/// use std::collections::HashMap;
+///
+/// use opendal::services::S3Config;
+/// use opendal::{Configurator, Operator};///
+/// use opendal::raw::HttpClient;
+///
+/// async fn test() -> Result<()> {
+///     let mut cfg = S3Config::default();
+///     cfg.root = Some("/".to_string());
+///     cfg.bucket = "test".to_string();
+///
+///     let builder = cfg.into_builder();
+///     let builder = builder.http_client(HttpClient::new()?);
+///
+///     // Build an `Operator` to start operating the storage.
+///     let op: Operator = Operator::new(builder)?.finish();
+///
+///     Ok(())
+/// }
+/// ```
 pub trait Configurator: Serialize + DeserializeOwned + Debug + 'static {
+    /// Associated builder for this configuration.
+    type Builder: Builder;
+
     /// Deserialize from an iterator.
     ///
     /// This API is provided by opendal, developer should not implement it.
@@ -107,9 +136,11 @@ pub trait Configurator: Serialize + DeserializeOwned + Debug + 'static {
     }
 
     /// Convert this configuration into a service builder.
-    fn into_builder(self) -> impl Builder;
+    fn into_builder(self) -> Self::Builder;
 }
 
 impl Configurator for () {
-    fn into_builder(self) -> impl Builder {}
+    type Builder = ();
+
+    fn into_builder(self) -> Self::Builder {}
 }