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 dae0c5fd6 refacrtor: Reduce usage of scheme inside raw (#6457)
dae0c5fd6 is described below

commit dae0c5fd6c5a3df731b304eb4be011e5dad25dc9
Author: Xuanwo <git...@xuanwo.io>
AuthorDate: Fri Aug 1 20:23:11 2025 +0800

    refacrtor: Reduce usage of scheme inside raw (#6457)
    
    * Don't use scheme inside raw
    
    Signed-off-by: Xuanwo <git...@xuanwo.io>
    
    * Add defaut scheme
    
    Signed-off-by: Xuanwo <git...@xuanwo.io>
    
    * Add default scehme for services
    
    Signed-off-by: Xuanwo <git...@xuanwo.io>
    
    * Fix tests
    
    Signed-off-by: Xuanwo <git...@xuanwo.io>
    
    ---------
    
    Signed-off-by: Xuanwo <git...@xuanwo.io>
---
 core/src/docs/internals/accessor.rs           |  3 +-
 core/src/layers/correctness_check.rs          |  1 +
 core/src/layers/error_context.rs              |  4 +-
 core/src/layers/fastmetrics.rs                |  2 +-
 core/src/layers/metrics.rs                    |  2 +-
 core/src/layers/observe/metrics.rs            |  2 +-
 core/src/layers/otelmetrics.rs                |  2 +-
 core/src/layers/prometheus.rs                 |  2 +-
 core/src/layers/prometheus_client.rs          |  2 +-
 core/src/layers/retry.rs                      | 24 ++++----
 core/src/raw/accessor.rs                      | 28 +++++++---
 core/src/raw/adapters/kv/backend.rs           |  2 +-
 core/src/raw/adapters/typed_kv/backend.rs     |  2 +-
 core/src/raw/azure.rs                         | 80 +++++++++++++++++----------
 core/src/raw/layer.rs                         |  2 +-
 core/src/services/aliyun_drive/backend.rs     |  5 +-
 core/src/services/aliyun_drive/mod.rs         |  3 +
 core/src/services/alluxio/backend.rs          |  5 +-
 core/src/services/alluxio/mod.rs              |  3 +
 core/src/services/azblob/backend.rs           |  5 +-
 core/src/services/azblob/mod.rs               |  3 +
 core/src/services/azdls/backend.rs            |  5 +-
 core/src/services/azdls/mod.rs                |  3 +
 core/src/services/azfile/backend.rs           |  5 +-
 core/src/services/azfile/mod.rs               |  3 +
 core/src/services/b2/backend.rs               |  5 +-
 core/src/services/b2/mod.rs                   |  3 +
 core/src/services/cacache/backend.rs          |  5 +-
 core/src/services/cacache/mod.rs              |  3 +
 core/src/services/cloudflare_kv/backend.rs    |  1 -
 core/src/services/compfs/backend.rs           |  5 +-
 core/src/services/compfs/mod.rs               |  3 +
 core/src/services/cos/backend.rs              |  5 +-
 core/src/services/cos/mod.rs                  |  3 +
 core/src/services/d1/backend.rs               |  1 -
 core/src/services/dashmap/backend.rs          |  5 +-
 core/src/services/dashmap/mod.rs              |  3 +
 core/src/services/dbfs/backend.rs             |  5 +-
 core/src/services/dbfs/mod.rs                 |  3 +
 core/src/services/dropbox/builder.rs          |  5 +-
 core/src/services/dropbox/mod.rs              |  3 +
 core/src/services/etcd/backend.rs             |  1 -
 core/src/services/foundationdb/backend.rs     |  1 -
 core/src/services/fs/backend.rs               |  5 +-
 core/src/services/fs/mod.rs                   |  3 +
 core/src/services/ftp/backend.rs              |  5 +-
 core/src/services/ftp/mod.rs                  |  3 +
 core/src/services/gcs/backend.rs              |  5 +-
 core/src/services/gcs/mod.rs                  |  3 +
 core/src/services/gdrive/builder.rs           |  5 +-
 core/src/services/gdrive/mod.rs               |  3 +
 core/src/services/ghac/backend.rs             |  5 +-
 core/src/services/ghac/mod.rs                 |  3 +
 core/src/services/ghac/writer.rs              |  2 +-
 core/src/services/github/backend.rs           |  5 +-
 core/src/services/github/mod.rs               |  3 +
 core/src/services/gridfs/backend.rs           |  1 -
 core/src/services/hdfs/backend.rs             |  5 +-
 core/src/services/hdfs/mod.rs                 |  3 +
 core/src/services/hdfs_native/backend.rs      |  5 +-
 core/src/services/hdfs_native/mod.rs          |  3 +
 core/src/services/http/backend.rs             |  5 +-
 core/src/services/http/mod.rs                 |  3 +
 core/src/services/huggingface/backend.rs      |  5 +-
 core/src/services/huggingface/mod.rs          |  3 +
 core/src/services/ipfs/backend.rs             |  5 +-
 core/src/services/ipfs/mod.rs                 |  3 +
 core/src/services/ipmfs/builder.rs            |  5 +-
 core/src/services/ipmfs/mod.rs                |  3 +
 core/src/services/koofr/backend.rs            |  5 +-
 core/src/services/koofr/mod.rs                |  3 +
 core/src/services/lakefs/backend.rs           |  5 +-
 core/src/services/lakefs/mod.rs               |  3 +
 core/src/services/memcached/backend.rs        |  1 -
 core/src/services/memory/backend.rs           |  5 +-
 core/src/services/memory/mod.rs               |  3 +
 core/src/services/mini_moka/backend.rs        |  5 +-
 core/src/services/mini_moka/mod.rs            |  3 +
 core/src/services/moka/backend.rs             |  5 +-
 core/src/services/moka/mod.rs                 |  3 +
 core/src/services/mongodb/backend.rs          |  1 -
 core/src/services/monoiofs/backend.rs         |  1 -
 core/src/services/monoiofs/core.rs            |  4 +-
 core/src/services/monoiofs/mod.rs             |  3 +
 core/src/services/mysql/backend.rs            |  1 -
 core/src/services/obs/backend.rs              |  5 +-
 core/src/services/obs/mod.rs                  |  3 +
 core/src/services/onedrive/builder.rs         |  5 +-
 core/src/services/onedrive/mod.rs             |  3 +
 core/src/services/oss/backend.rs              |  5 +-
 core/src/services/oss/mod.rs                  |  3 +
 core/src/services/pcloud/backend.rs           |  5 +-
 core/src/services/pcloud/mod.rs               |  3 +
 core/src/services/persy/backend.rs            |  1 -
 core/src/services/postgresql/backend.rs       |  1 -
 core/src/services/redb/backend.rs             |  1 -
 core/src/services/redis/backend.rs            |  7 +--
 core/src/services/redis/mod.rs                |  3 +
 core/src/services/rocksdb/backend.rs          |  1 -
 core/src/services/s3/backend.rs               |  4 +-
 core/src/services/s3/mod.rs                   |  3 +
 core/src/services/seafile/backend.rs          |  5 +-
 core/src/services/seafile/mod.rs              |  3 +
 core/src/services/sftp/backend.rs             |  5 +-
 core/src/services/sftp/mod.rs                 |  3 +
 core/src/services/sled/backend.rs             |  1 -
 core/src/services/sqlite/backend.rs           |  1 -
 core/src/services/surrealdb/backend.rs        |  1 -
 core/src/services/swift/backend.rs            |  5 +-
 core/src/services/swift/mod.rs                |  3 +
 core/src/services/tikv/backend.rs             |  1 -
 core/src/services/upyun/backend.rs            |  5 +-
 core/src/services/upyun/mod.rs                |  3 +
 core/src/services/vercel_artifacts/builder.rs |  6 +-
 core/src/services/vercel_artifacts/mod.rs     |  3 +
 core/src/services/vercel_blob/backend.rs      |  5 +-
 core/src/services/vercel_blob/mod.rs          |  3 +
 core/src/services/webdav/backend.rs           |  5 +-
 core/src/services/webdav/mod.rs               |  3 +
 core/src/services/webhdfs/backend.rs          |  5 +-
 core/src/services/webhdfs/mod.rs              |  3 +
 core/src/services/yandex_disk/backend.rs      |  5 +-
 core/src/services/yandex_disk/mod.rs          |  3 +
 core/src/types/builder.rs                     |  3 -
 core/src/types/operator/info.rs               |  4 +-
 core/src/types/operator/operator.rs           |  2 +-
 126 files changed, 328 insertions(+), 219 deletions(-)

diff --git a/core/src/docs/internals/accessor.rs 
b/core/src/docs/internals/accessor.rs
index 30c6c6293..7e629d367 100644
--- a/core/src/docs/internals/accessor.rs
+++ b/core/src/docs/internals/accessor.rs
@@ -251,7 +251,6 @@
 //! }
 //!
 //! impl Builder for DuckBuilder {
-//!     const SCHEME: Scheme = Scheme::Duck;
 //!     type Accessor = DuckBackend;
 //!     type Config = DuckConfig;
 //!
@@ -298,7 +297,7 @@
 //!
 //!     fn metadata(&self) -> AccessorInfo {
 //!         let am = AccessorInfo::default();
-//!         am.set_scheme(Scheme::Duck)
+//!         am.set_scheme("duck")
 //!             .set_root(&self.root)
 //!             .set_capability(
 //!                 Capability {
diff --git a/core/src/layers/correctness_check.rs 
b/core/src/layers/correctness_check.rs
index c0ba97b49..fd4fc3aa2 100644
--- a/core/src/layers/correctness_check.rs
+++ b/core/src/layers/correctness_check.rs
@@ -271,6 +271,7 @@ mod tests {
 
         fn info(&self) -> Arc<AccessorInfo> {
             let info = AccessorInfo::default();
+            info.set_scheme("memory");
             info.set_native_capability(self.capability);
 
             info.into()
diff --git a/core/src/layers/error_context.rs b/core/src/layers/error_context.rs
index f82a75152..315068a98 100644
--- a/core/src/layers/error_context.rs
+++ b/core/src/layers/error_context.rs
@@ -188,7 +188,7 @@ impl<A: Access> LayeredAccess for ErrorContextAccessor<A> {
 }
 
 pub struct ErrorContextWrapper<T> {
-    scheme: Scheme,
+    scheme: &'static str,
     path: String,
     inner: T,
     range: BytesRange,
@@ -196,7 +196,7 @@ pub struct ErrorContextWrapper<T> {
 }
 
 impl<T> ErrorContextWrapper<T> {
-    fn new(scheme: Scheme, path: String, inner: T) -> Self {
+    fn new(scheme: &'static str, path: String, inner: T) -> Self {
         Self {
             scheme,
             path,
diff --git a/core/src/layers/fastmetrics.rs b/core/src/layers/fastmetrics.rs
index 2ce066fe3..8ee44fc8d 100644
--- a/core/src/layers/fastmetrics.rs
+++ b/core/src/layers/fastmetrics.rs
@@ -508,7 +508,7 @@ struct OperationLabels {
 
 impl EncodeLabelSet for OperationLabels {
     fn encode(&self, encoder: &mut dyn LabelSetEncoder) -> fmt::Result {
-        encoder.encode(&(observe::LABEL_SCHEME, 
self.labels.scheme.into_static()))?;
+        encoder.encode(&(observe::LABEL_SCHEME, self.labels.scheme))?;
         encoder.encode(&(observe::LABEL_NAMESPACE, 
self.labels.namespace.as_ref()))?;
         if !self.disable_label_root {
             encoder.encode(&(observe::LABEL_ROOT, self.labels.root.as_ref()))?;
diff --git a/core/src/layers/metrics.rs b/core/src/layers/metrics.rs
index 90717bc90..cf3591c52 100644
--- a/core/src/layers/metrics.rs
+++ b/core/src/layers/metrics.rs
@@ -160,7 +160,7 @@ impl OperationLabels {
         let mut labels = Vec::with_capacity(6);
 
         labels.extend([
-            Label::new(observe::LABEL_SCHEME, self.0.scheme.into_static()),
+            Label::new(observe::LABEL_SCHEME, self.0.scheme),
             Label::new(observe::LABEL_NAMESPACE, self.0.namespace),
             Label::new(observe::LABEL_ROOT, self.0.root),
             Label::new(observe::LABEL_OPERATION, self.0.operation),
diff --git a/core/src/layers/observe/metrics.rs 
b/core/src/layers/observe/metrics.rs
index 20290338d..7e90d3da3 100644
--- a/core/src/layers/observe/metrics.rs
+++ b/core/src/layers/observe/metrics.rs
@@ -151,7 +151,7 @@ pub static LABEL_STATUS_CODE: &str = "status_code";
 pub struct MetricLabels {
     /// The storage scheme identifier (e.g., "s3", "gcs", "azblob", "fs").
     /// Used to differentiate between different storage backends.
-    pub scheme: Scheme,
+    pub scheme: &'static str,
     /// The storage namespace (e.g., bucket name, container name).
     /// Identifies the specific storage container being accessed.
     pub namespace: Arc<str>,
diff --git a/core/src/layers/otelmetrics.rs b/core/src/layers/otelmetrics.rs
index 95c416faa..c25b8a633 100644
--- a/core/src/layers/otelmetrics.rs
+++ b/core/src/layers/otelmetrics.rs
@@ -432,7 +432,7 @@ impl OtelMetricsInterceptor {
         let mut attributes = Vec::with_capacity(6);
 
         attributes.extend([
-            KeyValue::new(observe::LABEL_SCHEME, attrs.scheme.into_static()),
+            KeyValue::new(observe::LABEL_SCHEME, attrs.scheme),
             KeyValue::new(observe::LABEL_NAMESPACE, attrs.namespace),
             KeyValue::new(observe::LABEL_ROOT, attrs.root),
             KeyValue::new(observe::LABEL_OPERATION, attrs.operation),
diff --git a/core/src/layers/prometheus.rs b/core/src/layers/prometheus.rs
index 7667f0604..ce7bc8455 100644
--- a/core/src/layers/prometheus.rs
+++ b/core/src/layers/prometheus.rs
@@ -667,7 +667,7 @@ impl OperationLabels {
         let mut labels = Vec::with_capacity(6);
 
         labels.extend([
-            self.0.scheme.into_static(),
+            self.0.scheme,
             self.0.namespace.as_ref(),
             self.0.root.as_ref(),
             self.0.operation,
diff --git a/core/src/layers/prometheus_client.rs 
b/core/src/layers/prometheus_client.rs
index f6836f00e..827b7dd0d 100644
--- a/core/src/layers/prometheus_client.rs
+++ b/core/src/layers/prometheus_client.rs
@@ -490,7 +490,7 @@ struct OperationLabels {
 
 impl EncodeLabelSet for OperationLabels {
     fn encode(&self, mut encoder: LabelSetEncoder) -> Result<(), fmt::Error> {
-        (observe::LABEL_SCHEME, 
self.labels.scheme.into_static()).encode(encoder.encode_label())?;
+        (observe::LABEL_SCHEME, 
self.labels.scheme).encode(encoder.encode_label())?;
         (observe::LABEL_NAMESPACE, self.labels.namespace.as_ref())
             .encode(encoder.encode_label())?;
         if !self.disable_label_root {
diff --git a/core/src/layers/retry.rs b/core/src/layers/retry.rs
index 19471f732..3e4ab754c 100644
--- a/core/src/layers/retry.rs
+++ b/core/src/layers/retry.rs
@@ -619,7 +619,6 @@ mod tests {
     }
 
     impl Builder for MockBuilder {
-        const SCHEME: Scheme = Scheme::Custom("mock");
         type Config = ();
 
         fn build(self) -> Result<impl Access> {
@@ -642,18 +641,17 @@ mod tests {
 
         fn info(&self) -> Arc<AccessorInfo> {
             let am = AccessorInfo::default();
-            am.set_scheme(Scheme::Custom("mock"))
-                .set_native_capability(Capability {
-                    read: true,
-                    write: true,
-                    write_can_multi: true,
-                    delete: true,
-                    delete_max_size: Some(10),
-                    stat: true,
-                    list: true,
-                    list_with_recursive: true,
-                    ..Default::default()
-                });
+            am.set_scheme("mock").set_native_capability(Capability {
+                read: true,
+                write: true,
+                write_can_multi: true,
+                delete: true,
+                delete_max_size: Some(10),
+                stat: true,
+                list: true,
+                list_with_recursive: true,
+                ..Default::default()
+            });
 
             am.into()
         }
diff --git a/core/src/raw/accessor.rs b/core/src/raw/accessor.rs
index 821c0d32b..8a8157211 100644
--- a/core/src/raw/accessor.rs
+++ b/core/src/raw/accessor.rs
@@ -450,7 +450,7 @@ impl Access for () {
 
     fn info(&self) -> Arc<AccessorInfo> {
         let ai = AccessorInfo::default();
-        ai.set_scheme(Scheme::Custom("dummy"))
+        ai.set_scheme("dummy")
             .set_root("")
             .set_name("dummy")
             .set_native_capability(Capability::default());
@@ -543,9 +543,9 @@ impl<T: Access + ?Sized> Access for Arc<T> {
 /// Accessor is the type erased accessor with `Arc<dyn Accessor>`.
 pub type Accessor = Arc<dyn AccessDyn>;
 
-#[derive(Debug, Default)]
+#[derive(Debug)]
 struct AccessorInfoInner {
-    scheme: Scheme,
+    scheme: &'static str,
     root: Arc<str>,
     name: Arc<str>,
 
@@ -556,6 +556,20 @@ struct AccessorInfoInner {
     executor: Executor,
 }
 
+impl Default for AccessorInfoInner {
+    fn default() -> Self {
+        Self {
+            scheme: "unknown",
+            root: Arc::from(""),
+            name: Arc::from(""),
+            native_capability: Capability::default(),
+            full_capability: Capability::default(),
+            http_client: HttpClient::default(),
+            executor: Executor::default(),
+        }
+    }
+}
+
 /// Info for the accessor. Users can use this struct to retrieve information 
about the underlying backend.
 ///
 /// This struct is intentionally not implemented with `Clone` to ensure that 
all accesses
@@ -621,27 +635,27 @@ impl Hash for AccessorInfo {
 }
 
 impl AccessorInfo {
-    /// [`Scheme`] of backend.
+    /// Scheme of backend.
     ///
     /// # Panic Safety
     ///
     /// This method safely handles lock poisoning scenarios. If the inner 
`RwLock` is poisoned,
     /// this method will gracefully continue execution by simply returning the 
current scheme.
-    pub fn scheme(&self) -> Scheme {
+    pub fn scheme(&self) -> &'static str {
         match self.inner.read() {
             Ok(v) => v.scheme,
             Err(err) => err.get_ref().scheme,
         }
     }
 
-    /// Set [`Scheme`] for backend.
+    /// Set scheme for backend.
     ///
     /// # Panic Safety
     ///
     /// This method safely handles lock poisoning scenarios. If the inner 
`RwLock` is poisoned,
     /// this method will gracefully continue execution by simply skipping the 
update operation
     /// rather than propagating the panic.
-    pub fn set_scheme(&self, scheme: Scheme) -> &Self {
+    pub fn set_scheme(&self, scheme: &'static str) -> &Self {
         if let Ok(mut v) = self.inner.write() {
             v.scheme = scheme;
         }
diff --git a/core/src/raw/adapters/kv/backend.rs 
b/core/src/raw/adapters/kv/backend.rs
index 05bb716b1..dde5b1c50 100644
--- a/core/src/raw/adapters/kv/backend.rs
+++ b/core/src/raw/adapters/kv/backend.rs
@@ -51,7 +51,7 @@ where
             info: {
                 let am: AccessorInfo = AccessorInfo::default();
                 am.set_root("/");
-                am.set_scheme(kv_info.scheme());
+                am.set_scheme(kv_info.scheme().into_static());
                 am.set_name(kv_info.name());
 
                 let mut cap = kv_info.capabilities();
diff --git a/core/src/raw/adapters/typed_kv/backend.rs 
b/core/src/raw/adapters/typed_kv/backend.rs
index 8e08438b0..70aabdbe7 100644
--- a/core/src/raw/adapters/typed_kv/backend.rs
+++ b/core/src/raw/adapters/typed_kv/backend.rs
@@ -46,7 +46,7 @@ where
             info: {
                 let am: AccessorInfo = AccessorInfo::default();
                 am.set_root("/");
-                am.set_scheme(kv_info.scheme());
+                am.set_scheme(kv_info.scheme().into_static());
                 am.set_name(kv_info.name());
 
                 let kv_cap = kv_info.capabilities();
diff --git a/core/src/raw/azure.rs b/core/src/raw/azure.rs
index bfa58ee00..70c6f7fcc 100644
--- a/core/src/raw/azure.rs
+++ b/core/src/raw/azure.rs
@@ -75,10 +75,12 @@ pub(crate) enum AzureStorageService {
     Blob,
 
     /// Azure File Storage.
+    #[cfg(feature = "services-azfile")]
     File,
 
     /// Azure Data Lake Storage Gen2.
     /// Backed by Blob Storage but exposed through a different endpoint 
(`dfs`).
+    #[cfg(feature = "services-azdls")]
     Adls,
 }
 
@@ -180,7 +182,9 @@ fn collect_endpoint(
 ) -> Result<Option<String>> {
     match storage {
         AzureStorageService::Blob => collect_or_build_endpoint(key_values, 
"BlobEndpoint", "blob"),
+        #[cfg(feature = "services-azfile")]
         AzureStorageService::File => collect_or_build_endpoint(key_values, 
"FileEndpoint", "file"),
+        #[cfg(feature = "services-azdls")]
         AzureStorageService::Adls => {
             // ADLS doesn't have a dedicated endpoint field and we can only
             // build it from parts.
@@ -281,7 +285,8 @@ mod tests {
 
     #[test]
     fn test_azure_config_from_connection_string() {
-        let test_cases = vec![
+        #[allow(unused_mut)]
+        let mut test_cases = vec![
             ("minimal fields",
                 (AzureStorageService::Blob, 
"BlobEndpoint=https://testaccount.blob.core.windows.net/";),
                 Some(AzureStorageConfig{
@@ -322,29 +327,6 @@ mod tests {
                     ..Default::default()
                 }),
             ),
-            ("adls endpoint from parts",
-                (AzureStorageService::Adls, 
"AccountName=testaccount;EndpointSuffix=core.windows.net;DefaultEndpointsProtocol=https"),
-                Some(AzureStorageConfig{
-                    account_name: Some("testaccount".to_string()),
-                    endpoint: 
Some("https://testaccount.dfs.core.windows.net".to_string()),
-                    ..Default::default()
-                }),
-            ),
-            ("file endpoint from field",
-                (AzureStorageService::File, 
"FileEndpoint=https://testaccount.file.core.windows.net";),
-                Some(AzureStorageConfig{
-                    endpoint: 
Some("https://testaccount.file.core.windows.net".to_string()),
-                    ..Default::default()
-                })
-            ),
-            ("file endpoint from parts",
-                (AzureStorageService::File, 
"AccountName=testaccount;EndpointSuffix=core.windows.net"),
-                Some(AzureStorageConfig{
-                    account_name: Some("testaccount".to_string()),
-                    endpoint: 
Some("https://testaccount.file.core.windows.net".to_string()),
-                    ..Default::default()
-                }),
-            ),
             ("prefers sas over key",
                 (AzureStorageService::Blob, 
"AccountName=testaccount;AccountKey=testkey;SharedAccessSignature=sas_token"),
                 Some(AzureStorageConfig{
@@ -415,12 +397,54 @@ mod tests {
                 (AzureStorageService::Blob, 
"DefaultEndpointsProtocol=ftp;AccountName=example;EndpointSuffix=core.windows.net",),
                 None, // This should fail due to invalid protocol
             ),
-            ("azdls development storage",
-                (AzureStorageService::Adls, "UseDevelopmentStorage=true"),
-                Some(AzureStorageConfig::default()), // Azurite doesn't 
support ADLSv2, so we ignore this case
-            ),
         ];
 
+        #[cfg(feature = "services-azdls")]
+        test_cases.push(
+            ("adls endpoint from parts",
+                (AzureStorageService::Adls, 
"AccountName=testaccount;EndpointSuffix=core.windows.net;DefaultEndpointsProtocol=https"),
+                Some(AzureStorageConfig{
+                    account_name: Some("testaccount".to_string()),
+                    endpoint: 
Some("https://testaccount.dfs.core.windows.net".to_string()),
+                    ..Default::default()
+                }),
+            )
+        );
+
+        #[cfg(feature = "services-azfile")]
+        test_cases.extend(vec![
+            (
+                "file endpoint from field",
+                (
+                    AzureStorageService::File,
+                    "FileEndpoint=https://testaccount.file.core.windows.net";,
+                ),
+                Some(AzureStorageConfig {
+                    endpoint: 
Some("https://testaccount.file.core.windows.net".to_string()),
+                    ..Default::default()
+                }),
+            ),
+            (
+                "file endpoint from parts",
+                (
+                    AzureStorageService::File,
+                    "AccountName=testaccount;EndpointSuffix=core.windows.net",
+                ),
+                Some(AzureStorageConfig {
+                    account_name: Some("testaccount".to_string()),
+                    endpoint: 
Some("https://testaccount.file.core.windows.net".to_string()),
+                    ..Default::default()
+                }),
+            ),
+        ]);
+
+        #[cfg(feature = "services-azdls")]
+        test_cases.push((
+            "azdls development storage",
+            (AzureStorageService::Adls, "UseDevelopmentStorage=true"),
+            Some(AzureStorageConfig::default()), // Azurite doesn't support 
ADLSv2, so we ignore this case
+        ));
+
         for (name, (storage, conn_str), expected) in test_cases {
             let actual = azure_config_from_connection_string(conn_str, 
storage);
 
diff --git a/core/src/raw/layer.rs b/core/src/raw/layer.rs
index 86151c4e0..2d34d4956 100644
--- a/core/src/raw/layer.rs
+++ b/core/src/raw/layer.rs
@@ -261,7 +261,7 @@ mod tests {
 
         fn info(&self) -> Arc<AccessorInfo> {
             let am = AccessorInfo::default();
-            am.set_scheme(Scheme::Custom("test"));
+            am.set_scheme("test");
             am.into()
         }
 
diff --git a/core/src/services/aliyun_drive/backend.rs 
b/core/src/services/aliyun_drive/backend.rs
index 2a1ca4893..572ffb6af 100644
--- a/core/src/services/aliyun_drive/backend.rs
+++ b/core/src/services/aliyun_drive/backend.rs
@@ -32,10 +32,10 @@ use super::error::parse_error;
 use super::lister::AliyunDriveLister;
 use super::lister::AliyunDriveParent;
 use super::writer::AliyunDriveWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::AliyunDriveConfig;
 use crate::*;
-
 impl Configurator for AliyunDriveConfig {
     type Builder = AliyunDriveBuilder;
 
@@ -130,7 +130,6 @@ impl AliyunDriveBuilder {
 }
 
 impl Builder for AliyunDriveBuilder {
-    const SCHEME: Scheme = Scheme::AliyunDrive;
     type Config = AliyunDriveConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -177,7 +176,7 @@ impl Builder for AliyunDriveBuilder {
             core: Arc::new(AliyunDriveCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::AliyunDrive)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/aliyun_drive/mod.rs 
b/core/src/services/aliyun_drive/mod.rs
index 19c725b42..ef1862bbc 100644
--- a/core/src/services/aliyun_drive/mod.rs
+++ b/core/src/services/aliyun_drive/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for aliyun_drive service.
+#[cfg(feature = "services-aliyun-drive")]
+pub(super) const DEFAULT_SCHEME: &str = "aliyun_drive";
 #[cfg(feature = "services-aliyun-drive")]
 mod core;
 
diff --git a/core/src/services/alluxio/backend.rs 
b/core/src/services/alluxio/backend.rs
index 01c04cb49..650531b31 100644
--- a/core/src/services/alluxio/backend.rs
+++ b/core/src/services/alluxio/backend.rs
@@ -28,10 +28,10 @@ use super::error::parse_error;
 use super::lister::AlluxioLister;
 use super::writer::AlluxioWriter;
 use super::writer::AlluxioWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::AlluxioConfig;
 use crate::*;
-
 impl Configurator for AlluxioConfig {
     type Builder = AlluxioBuilder;
 
@@ -104,7 +104,6 @@ impl AlluxioBuilder {
 }
 
 impl Builder for AlluxioBuilder {
-    const SCHEME: Scheme = Scheme::Alluxio;
     type Config = AlluxioConfig;
 
     /// Builds the backend and returns the result of AlluxioBackend.
@@ -126,7 +125,7 @@ impl Builder for AlluxioBuilder {
             core: Arc::new(AlluxioCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Alluxio)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/alluxio/mod.rs b/core/src/services/alluxio/mod.rs
index 611a8a227..71cd2b0e9 100644
--- a/core/src/services/alluxio/mod.rs
+++ b/core/src/services/alluxio/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for alluxio service.
+#[cfg(feature = "services-alluxio")]
+pub(super) const DEFAULT_SCHEME: &str = "alluxio";
 #[cfg(feature = "services-alluxio")]
 mod core;
 #[cfg(feature = "services-alluxio")]
diff --git a/core/src/services/azblob/backend.rs 
b/core/src/services/azblob/backend.rs
index 4a1dfa270..c00c93a47 100644
--- a/core/src/services/azblob/backend.rs
+++ b/core/src/services/azblob/backend.rs
@@ -38,10 +38,10 @@ use super::error::parse_error;
 use super::lister::AzblobLister;
 use super::writer::AzblobWriter;
 use super::writer::AzblobWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::AzblobConfig;
 use crate::*;
-
 const AZBLOB_BATCH_LIMIT: usize = 256;
 
 impl From<AzureStorageConfig> for AzblobConfig {
@@ -301,7 +301,6 @@ impl AzblobBuilder {
 }
 
 impl Builder for AzblobBuilder {
-    const SCHEME: Scheme = Scheme::Azblob;
     type Config = AzblobConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -385,7 +384,7 @@ impl Builder for AzblobBuilder {
             core: Arc::new(AzblobCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Azblob)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(container)
                         .set_native_capability(Capability {
diff --git a/core/src/services/azblob/mod.rs b/core/src/services/azblob/mod.rs
index c95e8b90d..818ed4628 100644
--- a/core/src/services/azblob/mod.rs
+++ b/core/src/services/azblob/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for azblob service.
+#[cfg(feature = "services-azblob")]
+pub(super) const DEFAULT_SCHEME: &str = "azblob";
 #[cfg(feature = "services-azblob")]
 pub(crate) mod core;
 #[cfg(feature = "services-azblob")]
diff --git a/core/src/services/azdls/backend.rs 
b/core/src/services/azdls/backend.rs
index e4916acf9..8413c3def 100644
--- a/core/src/services/azdls/backend.rs
+++ b/core/src/services/azdls/backend.rs
@@ -33,10 +33,10 @@ use super::error::parse_error;
 use super::lister::AzdlsLister;
 use super::writer::AzdlsWriter;
 use super::writer::AzdlsWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::AzdlsConfig;
 use crate::*;
-
 impl From<AzureStorageConfig> for AzdlsConfig {
     fn from(config: AzureStorageConfig) -> Self {
         AzdlsConfig {
@@ -249,7 +249,6 @@ impl AzdlsBuilder {
 }
 
 impl Builder for AzdlsBuilder {
-    const SCHEME: Scheme = Scheme::Azdls;
     type Config = AzdlsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -296,7 +295,7 @@ impl Builder for AzdlsBuilder {
             core: Arc::new(AzdlsCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Azdls)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(filesystem)
                         .set_native_capability(Capability {
diff --git a/core/src/services/azdls/mod.rs b/core/src/services/azdls/mod.rs
index 98547dd1c..643d11aad 100644
--- a/core/src/services/azdls/mod.rs
+++ b/core/src/services/azdls/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for azdls service.
+#[cfg(feature = "services-azdls")]
+pub(super) const DEFAULT_SCHEME: &str = "azdls";
 #[cfg(feature = "services-azdls")]
 mod backend;
 #[cfg(feature = "services-azdls")]
diff --git a/core/src/services/azfile/backend.rs 
b/core/src/services/azfile/backend.rs
index 725580a81..9c6f16566 100644
--- a/core/src/services/azfile/backend.rs
+++ b/core/src/services/azfile/backend.rs
@@ -32,10 +32,10 @@ use super::error::parse_error;
 use super::lister::AzfileLister;
 use super::writer::AzfileWriter;
 use super::writer::AzfileWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::AzfileConfig;
 use crate::*;
-
 impl From<AzureStorageConfig> for AzfileConfig {
     fn from(config: AzureStorageConfig) -> Self {
         AzfileConfig {
@@ -181,7 +181,6 @@ impl AzfileBuilder {
 }
 
 impl Builder for AzfileBuilder {
-    const SCHEME: Scheme = Scheme::Azfile;
     type Config = AzfileConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -226,7 +225,7 @@ impl Builder for AzfileBuilder {
             core: Arc::new(AzfileCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Azfile)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/azfile/mod.rs b/core/src/services/azfile/mod.rs
index 38c9ba041..99ca22abf 100644
--- a/core/src/services/azfile/mod.rs
+++ b/core/src/services/azfile/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for azfile service.
+#[cfg(feature = "services-azfile")]
+pub(super) const DEFAULT_SCHEME: &str = "azfile";
 #[cfg(feature = "services-azfile")]
 mod core;
 #[cfg(feature = "services-azfile")]
diff --git a/core/src/services/b2/backend.rs b/core/src/services/b2/backend.rs
index 064e8d15d..f1674a03b 100644
--- a/core/src/services/b2/backend.rs
+++ b/core/src/services/b2/backend.rs
@@ -34,10 +34,10 @@ use super::error::parse_error;
 use super::lister::B2Lister;
 use super::writer::B2Writer;
 use super::writer::B2Writers;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::B2Config;
 use crate::*;
-
 impl Configurator for B2Config {
     type Builder = B2Builder;
 
@@ -136,7 +136,6 @@ impl B2Builder {
 }
 
 impl Builder for B2Builder {
-    const SCHEME: Scheme = Scheme::B2;
     type Config = B2Config;
 
     /// Builds the backend and returns the result of B2Backend.
@@ -192,7 +191,7 @@ impl Builder for B2Builder {
             core: Arc::new(B2Core {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::B2)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/b2/mod.rs b/core/src/services/b2/mod.rs
index 5193f960c..09c6b4bfe 100644
--- a/core/src/services/b2/mod.rs
+++ b/core/src/services/b2/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for b2 service.
+#[cfg(feature = "services-b2")]
+pub(super) const DEFAULT_SCHEME: &str = "b2";
 #[cfg(feature = "services-b2")]
 mod core;
 #[cfg(feature = "services-b2")]
diff --git a/core/src/services/cacache/backend.rs 
b/core/src/services/cacache/backend.rs
index f48610e92..5ed9f5633 100644
--- a/core/src/services/cacache/backend.rs
+++ b/core/src/services/cacache/backend.rs
@@ -27,7 +27,7 @@ use crate::*;
 use super::core::CacacheCore;
 use super::delete::CacacheDeleter;
 use super::writer::CacacheWriter;
-
+use super::DEFAULT_SCHEME;
 impl Configurator for CacacheConfig {
     type Builder = CacacheBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -51,7 +51,6 @@ impl CacacheBuilder {
 }
 
 impl Builder for CacacheBuilder {
-    const SCHEME: Scheme = Scheme::Cacache;
     type Config = CacacheConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -65,7 +64,7 @@ impl Builder for CacacheBuilder {
         };
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Cacache);
+        info.set_scheme(DEFAULT_SCHEME);
         info.set_name(&datadir_path);
         info.set_root("/");
         info.set_native_capability(Capability {
diff --git a/core/src/services/cacache/mod.rs b/core/src/services/cacache/mod.rs
index 79d0faa60..54f973e8d 100644
--- a/core/src/services/cacache/mod.rs
+++ b/core/src/services/cacache/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for cacache service.
+#[cfg(feature = "services-cacache")]
+pub(super) const DEFAULT_SCHEME: &str = "cacache";
 #[cfg(feature = "services-cacache")]
 mod backend;
 #[cfg(feature = "services-cacache")]
diff --git a/core/src/services/cloudflare_kv/backend.rs 
b/core/src/services/cloudflare_kv/backend.rs
index aa48cb66d..d2cbda4d0 100644
--- a/core/src/services/cloudflare_kv/backend.rs
+++ b/core/src/services/cloudflare_kv/backend.rs
@@ -96,7 +96,6 @@ impl CloudflareKvBuilder {
 }
 
 impl Builder for CloudflareKvBuilder {
-    const SCHEME: Scheme = Scheme::CloudflareKv;
     type Config = CloudflareKvConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/compfs/backend.rs 
b/core/src/services/compfs/backend.rs
index a93270e16..86f7c835f 100644
--- a/core/src/services/compfs/backend.rs
+++ b/core/src/services/compfs/backend.rs
@@ -26,11 +26,11 @@ use super::delete::CompfsDeleter;
 use super::lister::CompfsLister;
 use super::reader::CompfsReader;
 use super::writer::CompfsWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio::OneShotDeleter;
 use crate::raw::*;
 use crate::services::CompfsConfig;
 use crate::*;
-
 impl Configurator for CompfsConfig {
     type Builder = CompfsBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -58,7 +58,6 @@ impl CompfsBuilder {
 }
 
 impl Builder for CompfsBuilder {
-    const SCHEME: Scheme = Scheme::Compfs;
     type Config = CompfsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -91,7 +90,7 @@ impl Builder for CompfsBuilder {
         let core = CompfsCore {
             info: {
                 let am = AccessorInfo::default();
-                am.set_scheme(Scheme::Compfs)
+                am.set_scheme(DEFAULT_SCHEME)
                     .set_root(&root)
                     .set_native_capability(Capability {
                         stat: true,
diff --git a/core/src/services/compfs/mod.rs b/core/src/services/compfs/mod.rs
index 53b7f746f..252d67f08 100644
--- a/core/src/services/compfs/mod.rs
+++ b/core/src/services/compfs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for compfs service.
+#[cfg(feature = "services-compfs")]
+pub(super) const DEFAULT_SCHEME: &str = "compfs";
 #[cfg(feature = "services-compfs")]
 mod core;
 #[cfg(feature = "services-compfs")]
diff --git a/core/src/services/cos/backend.rs b/core/src/services/cos/backend.rs
index d41365121..da2d29804 100644
--- a/core/src/services/cos/backend.rs
+++ b/core/src/services/cos/backend.rs
@@ -34,11 +34,11 @@ use super::lister::CosListers;
 use super::lister::CosObjectVersionsLister;
 use super::writer::CosWriter;
 use super::writer::CosWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio::PageLister;
 use crate::raw::*;
 use crate::services::CosConfig;
 use crate::*;
-
 impl Configurator for CosConfig {
     type Builder = CosBuilder;
 
@@ -164,7 +164,6 @@ impl CosBuilder {
 }
 
 impl Builder for CosBuilder {
-    const SCHEME: Scheme = Scheme::Cos;
     type Config = CosConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -222,7 +221,7 @@ impl Builder for CosBuilder {
             core: Arc::new(CosCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Cos)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(&bucket)
                         .set_native_capability(Capability {
diff --git a/core/src/services/cos/mod.rs b/core/src/services/cos/mod.rs
index 7aff39738..486597aa2 100644
--- a/core/src/services/cos/mod.rs
+++ b/core/src/services/cos/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for cos service.
+#[cfg(feature = "services-cos")]
+pub(super) const DEFAULT_SCHEME: &str = "cos";
 #[cfg(feature = "services-cos")]
 mod core;
 #[cfg(feature = "services-cos")]
diff --git a/core/src/services/d1/backend.rs b/core/src/services/d1/backend.rs
index b6897aa3e..6e4705791 100644
--- a/core/src/services/d1/backend.rs
+++ b/core/src/services/d1/backend.rs
@@ -135,7 +135,6 @@ impl D1Builder {
 }
 
 impl Builder for D1Builder {
-    const SCHEME: Scheme = Scheme::D1;
     type Config = D1Config;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/dashmap/backend.rs 
b/core/src/services/dashmap/backend.rs
index 300900785..2bffa9082 100644
--- a/core/src/services/dashmap/backend.rs
+++ b/core/src/services/dashmap/backend.rs
@@ -26,11 +26,11 @@ use super::core::DashmapCore;
 use super::delete::DashmapDeleter;
 use super::lister::DashmapLister;
 use super::writer::DashmapWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio;
 use crate::raw::*;
 use crate::services::DashmapConfig;
 use crate::*;
-
 impl Configurator for DashmapConfig {
     type Builder = DashmapBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -67,7 +67,6 @@ impl DashmapBuilder {
 }
 
 impl Builder for DashmapBuilder {
-    const SCHEME: Scheme = Scheme::Dashmap;
     type Config = DashmapConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -101,7 +100,7 @@ pub struct DashmapAccessor {
 impl DashmapAccessor {
     fn new(core: DashmapCore, root: String) -> Self {
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Dashmap);
+        info.set_scheme(DEFAULT_SCHEME);
         info.set_name("dashmap");
         info.set_root(&root);
         info.set_native_capability(Capability {
diff --git a/core/src/services/dashmap/mod.rs b/core/src/services/dashmap/mod.rs
index 0d128063d..71356a6ca 100644
--- a/core/src/services/dashmap/mod.rs
+++ b/core/src/services/dashmap/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for dashmap service.
+#[cfg(feature = "services-dashmap")]
+pub(super) const DEFAULT_SCHEME: &str = "dashmap";
 #[cfg(feature = "services-dashmap")]
 mod backend;
 #[cfg(feature = "services-dashmap")]
diff --git a/core/src/services/dbfs/backend.rs 
b/core/src/services/dbfs/backend.rs
index 1f4bc908e..3e3babe24 100644
--- a/core/src/services/dbfs/backend.rs
+++ b/core/src/services/dbfs/backend.rs
@@ -29,10 +29,10 @@ use super::delete::DbfsDeleter;
 use super::error::parse_error;
 use super::lister::DbfsLister;
 use super::writer::DbfsWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::DbfsConfig;
 use crate::*;
-
 impl Configurator for DbfsConfig {
     type Builder = DbfsBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -96,7 +96,6 @@ impl DbfsBuilder {
 }
 
 impl Builder for DbfsBuilder {
-    const SCHEME: Scheme = Scheme::Dbfs;
     type Config = DbfsConfig;
 
     /// Build a DbfsBackend.
@@ -150,7 +149,7 @@ impl Access for DbfsBackend {
 
     fn info(&self) -> Arc<AccessorInfo> {
         let am = AccessorInfo::default();
-        am.set_scheme(Scheme::Dbfs)
+        am.set_scheme(DEFAULT_SCHEME)
             .set_root(&self.core.root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/dbfs/mod.rs b/core/src/services/dbfs/mod.rs
index b2b1a470b..c76040a55 100644
--- a/core/src/services/dbfs/mod.rs
+++ b/core/src/services/dbfs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for dbfs service.
+#[cfg(feature = "services-dbfs")]
+pub(super) const DEFAULT_SCHEME: &str = "dbfs";
 #[cfg(feature = "services-dbfs")]
 mod core;
 #[cfg(feature = "services-dbfs")]
diff --git a/core/src/services/dropbox/builder.rs 
b/core/src/services/dropbox/builder.rs
index 6c7b624ce..17a39b904 100644
--- a/core/src/services/dropbox/builder.rs
+++ b/core/src/services/dropbox/builder.rs
@@ -26,10 +26,10 @@ use tokio::sync::Mutex;
 use super::backend::DropboxBackend;
 use super::core::DropboxCore;
 use super::core::DropboxSigner;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::DropboxConfig;
 use crate::*;
-
 impl Configurator for DropboxConfig {
     type Builder = DropboxBuilder;
 
@@ -126,7 +126,6 @@ impl DropboxBuilder {
 }
 
 impl Builder for DropboxBuilder {
-    const SCHEME: Scheme = Scheme::Dropbox;
     type Config = DropboxConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -182,7 +181,7 @@ impl Builder for DropboxBuilder {
             core: Arc::new(DropboxCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Dropbox)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/dropbox/mod.rs b/core/src/services/dropbox/mod.rs
index 682a93074..a3c6f77d8 100644
--- a/core/src/services/dropbox/mod.rs
+++ b/core/src/services/dropbox/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for dropbox service.
+#[cfg(feature = "services-dropbox")]
+pub(super) const DEFAULT_SCHEME: &str = "dropbox";
 #[cfg(feature = "services-dropbox")]
 mod backend;
 #[cfg(feature = "services-dropbox")]
diff --git a/core/src/services/etcd/backend.rs 
b/core/src/services/etcd/backend.rs
index fb3ac36aa..01e67a2ed 100644
--- a/core/src/services/etcd/backend.rs
+++ b/core/src/services/etcd/backend.rs
@@ -136,7 +136,6 @@ impl EtcdBuilder {
 }
 
 impl Builder for EtcdBuilder {
-    const SCHEME: Scheme = Scheme::Etcd;
     type Config = EtcdConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/foundationdb/backend.rs 
b/core/src/services/foundationdb/backend.rs
index c72099cb1..51f721ce6 100644
--- a/core/src/services/foundationdb/backend.rs
+++ b/core/src/services/foundationdb/backend.rs
@@ -59,7 +59,6 @@ impl FoundationdbBuilder {
 }
 
 impl Builder for FoundationdbBuilder {
-    const SCHEME: Scheme = Scheme::Foundationdb;
     type Config = FoundationdbConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/fs/backend.rs b/core/src/services/fs/backend.rs
index d7d50107f..6e2b11a4d 100644
--- a/core/src/services/fs/backend.rs
+++ b/core/src/services/fs/backend.rs
@@ -26,10 +26,10 @@ use super::lister::FsLister;
 use super::reader::FsReader;
 use super::writer::FsWriter;
 use super::writer::FsWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::FsConfig;
 use crate::*;
-
 impl Configurator for FsConfig {
     type Builder = FsBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -72,7 +72,6 @@ impl FsBuilder {
 }
 
 impl Builder for FsBuilder {
-    const SCHEME: Scheme = Scheme::Fs;
     type Config = FsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -145,7 +144,7 @@ impl Builder for FsBuilder {
             core: Arc::new(FsCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Fs)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root.to_string_lossy())
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/fs/mod.rs b/core/src/services/fs/mod.rs
index cbfefd3cf..cc5951c95 100644
--- a/core/src/services/fs/mod.rs
+++ b/core/src/services/fs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for fs service.
+#[cfg(feature = "services-fs")]
+pub(super) const DEFAULT_SCHEME: &str = "fs";
 #[cfg(feature = "services-fs")]
 mod core;
 #[cfg(feature = "services-fs")]
diff --git a/core/src/services/ftp/backend.rs b/core/src/services/ftp/backend.rs
index 9d4ece031..a1befc5e2 100644
--- a/core/src/services/ftp/backend.rs
+++ b/core/src/services/ftp/backend.rs
@@ -36,10 +36,10 @@ use super::err::parse_error;
 use super::lister::FtpLister;
 use super::reader::FtpReader;
 use super::writer::FtpWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::FtpConfig;
 use crate::*;
-
 impl Configurator for FtpConfig {
     type Builder = FtpBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -109,7 +109,6 @@ impl FtpBuilder {
 }
 
 impl Builder for FtpBuilder {
-    const SCHEME: Scheme = Scheme::Ftp;
     type Config = FtpConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -162,7 +161,7 @@ impl Builder for FtpBuilder {
 
         let accessor_info = AccessorInfo::default();
         accessor_info
-            .set_scheme(Scheme::Ftp)
+            .set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/ftp/mod.rs b/core/src/services/ftp/mod.rs
index 0b686037e..b264a54a0 100644
--- a/core/src/services/ftp/mod.rs
+++ b/core/src/services/ftp/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for ftp service.
+#[cfg(feature = "services-ftp")]
+pub(super) const DEFAULT_SCHEME: &str = "ftp";
 #[cfg(feature = "services-ftp")]
 mod delete;
 #[cfg(feature = "services-ftp")]
diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs
index 4cd49677f..d93efbce5 100644
--- a/core/src/services/gcs/backend.rs
+++ b/core/src/services/gcs/backend.rs
@@ -33,11 +33,11 @@ use super::error::parse_error;
 use super::lister::GcsLister;
 use super::writer::GcsWriter;
 use super::writer::GcsWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio::BatchDeleter;
 use crate::raw::*;
 use crate::services::GcsConfig;
 use crate::*;
-
 const DEFAULT_GCS_ENDPOINT: &str = "https://storage.googleapis.com";;
 const DEFAULT_GCS_SCOPE: &str = 
"https://www.googleapis.com/auth/devstorage.read_write";;
 
@@ -234,7 +234,6 @@ impl GcsBuilder {
 }
 
 impl Builder for GcsBuilder {
-    const SCHEME: Scheme = Scheme::Gcs;
     type Config = GcsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -308,7 +307,7 @@ impl Builder for GcsBuilder {
             core: Arc::new(GcsCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Gcs)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(bucket)
                         .set_native_capability(Capability {
diff --git a/core/src/services/gcs/mod.rs b/core/src/services/gcs/mod.rs
index d0372f8d7..a4d5d9712 100644
--- a/core/src/services/gcs/mod.rs
+++ b/core/src/services/gcs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for gcs service.
+#[cfg(feature = "services-gcs")]
+pub(super) const DEFAULT_SCHEME: &str = "gcs";
 #[cfg(feature = "services-gcs")]
 mod core;
 #[cfg(feature = "services-gcs")]
diff --git a/core/src/services/gdrive/builder.rs 
b/core/src/services/gdrive/builder.rs
index 9e9c62b02..8fc8d84d0 100644
--- a/core/src/services/gdrive/builder.rs
+++ b/core/src/services/gdrive/builder.rs
@@ -28,6 +28,7 @@ use super::backend::GdriveBackend;
 use super::core::GdriveCore;
 use super::core::GdrivePathQuery;
 use super::core::GdriveSigner;
+use super::DEFAULT_SCHEME;
 use crate::raw::normalize_root;
 use crate::raw::Access;
 use crate::raw::AccessorInfo;
@@ -36,7 +37,6 @@ use crate::raw::PathCacher;
 use crate::services::GdriveConfig;
 use crate::Scheme;
 use crate::*;
-
 impl Configurator for GdriveConfig {
     type Builder = GdriveBuilder;
 
@@ -135,7 +135,6 @@ impl GdriveBuilder {
 }
 
 impl Builder for GdriveBuilder {
-    const SCHEME: Scheme = Scheme::Gdrive;
     type Config = GdriveConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -143,7 +142,7 @@ impl Builder for GdriveBuilder {
         debug!("backend use root {root}");
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Gdrive)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/gdrive/mod.rs b/core/src/services/gdrive/mod.rs
index 4b6ce70fa..aa7e170f8 100644
--- a/core/src/services/gdrive/mod.rs
+++ b/core/src/services/gdrive/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for gdrive service.
+#[cfg(feature = "services-gdrive")]
+pub(super) const DEFAULT_SCHEME: &str = "gdrive";
 #[cfg(feature = "services-gdrive")]
 mod backend;
 #[cfg(feature = "services-gdrive")]
diff --git a/core/src/services/ghac/backend.rs 
b/core/src/services/ghac/backend.rs
index 08a6f6d47..ebbb081fa 100644
--- a/core/src/services/ghac/backend.rs
+++ b/core/src/services/ghac/backend.rs
@@ -26,11 +26,11 @@ use sha2::Digest;
 use super::core::*;
 use super::error::parse_error;
 use super::writer::GhacWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::ghac::core::GhacCore;
 use crate::services::GhacConfig;
 use crate::*;
-
 fn value_or_env(
     explicit_value: Option<String>,
     env_var_name: &str,
@@ -136,7 +136,6 @@ impl GhacBuilder {
 }
 
 impl Builder for GhacBuilder {
-    const SCHEME: Scheme = Scheme::Ghac;
     type Config = GhacConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -174,7 +173,7 @@ impl Builder for GhacBuilder {
         let core = GhacCore {
             info: {
                 let am = AccessorInfo::default();
-                am.set_scheme(Scheme::Ghac)
+                am.set_scheme(DEFAULT_SCHEME)
                     .set_root(&root)
                     .set_name(&version)
                     .set_native_capability(Capability {
diff --git a/core/src/services/ghac/mod.rs b/core/src/services/ghac/mod.rs
index 878f4c8c8..0b4d86229 100644
--- a/core/src/services/ghac/mod.rs
+++ b/core/src/services/ghac/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for ghac service.
+#[cfg(feature = "services-ghac")]
+pub(super) const DEFAULT_SCHEME: &str = "ghac";
 #[cfg(feature = "services-ghac")]
 mod error;
 #[cfg(feature = "services-ghac")]
diff --git a/core/src/services/ghac/writer.rs b/core/src/services/ghac/writer.rs
index 51bf5d5a7..e0d550753 100644
--- a/core/src/services/ghac/writer.rs
+++ b/core/src/services/ghac/writer.rs
@@ -68,7 +68,7 @@ impl GhacWriter {
                 let azure_core = Arc::new(AzblobCore {
                     info: {
                         let am = AccessorInfo::default();
-                        am.set_scheme(Scheme::Azblob)
+                        am.set_scheme("azblob")
                             .set_root("/")
                             .set_name(container)
                             .set_native_capability(Capability {
diff --git a/core/src/services/github/backend.rs 
b/core/src/services/github/backend.rs
index 6830c693c..5e1968389 100644
--- a/core/src/services/github/backend.rs
+++ b/core/src/services/github/backend.rs
@@ -31,10 +31,10 @@ use super::error::parse_error;
 use super::lister::GithubLister;
 use super::writer::GithubWriter;
 use super::writer::GithubWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::GithubConfig;
 use crate::*;
-
 impl Configurator for GithubConfig {
     type Builder = GithubBuilder;
 
@@ -119,7 +119,6 @@ impl GithubBuilder {
 }
 
 impl Builder for GithubBuilder {
-    const SCHEME: Scheme = Scheme::Github;
     type Config = GithubConfig;
 
     /// Builds the backend and returns the result of GithubBackend.
@@ -151,7 +150,7 @@ impl Builder for GithubBuilder {
             core: Arc::new(GithubCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Github)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/github/mod.rs b/core/src/services/github/mod.rs
index d0ae3eda9..7d7fda699 100644
--- a/core/src/services/github/mod.rs
+++ b/core/src/services/github/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for github service.
+#[cfg(feature = "services-github")]
+pub(super) const DEFAULT_SCHEME: &str = "github";
 #[cfg(feature = "services-github")]
 mod core;
 #[cfg(feature = "services-github")]
diff --git a/core/src/services/gridfs/backend.rs 
b/core/src/services/gridfs/backend.rs
index 9edb239d9..bd24007b2 100644
--- a/core/src/services/gridfs/backend.rs
+++ b/core/src/services/gridfs/backend.rs
@@ -119,7 +119,6 @@ impl GridfsBuilder {
 }
 
 impl Builder for GridfsBuilder {
-    const SCHEME: Scheme = Scheme::Gridfs;
     type Config = GridfsConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/hdfs/backend.rs 
b/core/src/services/hdfs/backend.rs
index 81e287228..e549d9850 100644
--- a/core/src/services/hdfs/backend.rs
+++ b/core/src/services/hdfs/backend.rs
@@ -28,10 +28,10 @@ use super::delete::HdfsDeleter;
 use super::lister::HdfsLister;
 use super::reader::HdfsReader;
 use super::writer::HdfsWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::HdfsConfig;
 use crate::*;
-
 impl Configurator for HdfsConfig {
     type Builder = HdfsBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -125,7 +125,6 @@ impl HdfsBuilder {
 }
 
 impl Builder for HdfsBuilder {
-    const SCHEME: Scheme = Scheme::Hdfs;
     type Config = HdfsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -175,7 +174,7 @@ impl Builder for HdfsBuilder {
         Ok(HdfsBackend {
             info: {
                 let am = AccessorInfo::default();
-                am.set_scheme(Scheme::Hdfs)
+                am.set_scheme(DEFAULT_SCHEME)
                     .set_root(&root)
                     .set_native_capability(Capability {
                         stat: true,
diff --git a/core/src/services/hdfs/mod.rs b/core/src/services/hdfs/mod.rs
index e93e2776c..3ffbcb033 100644
--- a/core/src/services/hdfs/mod.rs
+++ b/core/src/services/hdfs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for hdfs service.
+#[cfg(feature = "services-hdfs")]
+pub(super) const DEFAULT_SCHEME: &str = "hdfs";
 #[cfg(feature = "services-hdfs")]
 mod delete;
 #[cfg(feature = "services-hdfs")]
diff --git a/core/src/services/hdfs_native/backend.rs 
b/core/src/services/hdfs_native/backend.rs
index 99e485739..bd71fd2d7 100644
--- a/core/src/services/hdfs_native/backend.rs
+++ b/core/src/services/hdfs_native/backend.rs
@@ -28,10 +28,10 @@ use super::error::parse_hdfs_error;
 use super::lister::HdfsNativeLister;
 use super::reader::HdfsNativeReader;
 use super::writer::HdfsNativeWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::HdfsNativeConfig;
 use crate::*;
-
 /// [Hadoop Distributed File System (HDFS™)](https://hadoop.apache.org/) 
support.
 /// Using [Native Rust HDFS client](https://github.com/Kimahriman/hdfs-native).
 impl Configurator for HdfsNativeConfig {
@@ -94,7 +94,6 @@ impl HdfsNativeBuilder {
 }
 
 impl Builder for HdfsNativeBuilder {
-    const SCHEME: Scheme = Scheme::HdfsNative;
     type Config = HdfsNativeConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -150,7 +149,7 @@ impl Access for HdfsNativeBackend {
 
     fn info(&self) -> Arc<AccessorInfo> {
         let am = AccessorInfo::default();
-        am.set_scheme(Scheme::HdfsNative)
+        am.set_scheme(DEFAULT_SCHEME)
             .set_root(&self.root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/hdfs_native/mod.rs 
b/core/src/services/hdfs_native/mod.rs
index 071f45dfb..4c9c1ff02 100644
--- a/core/src/services/hdfs_native/mod.rs
+++ b/core/src/services/hdfs_native/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for hdfs_native service.
+#[cfg(feature = "services-hdfs-native")]
+pub(super) const DEFAULT_SCHEME: &str = "hdfs_native";
 #[cfg(feature = "services-hdfs-native")]
 mod delete;
 #[cfg(feature = "services-hdfs-native")]
diff --git a/core/src/services/http/backend.rs 
b/core/src/services/http/backend.rs
index 0ee448a7e..1f4eeb61a 100644
--- a/core/src/services/http/backend.rs
+++ b/core/src/services/http/backend.rs
@@ -25,10 +25,10 @@ use log::debug;
 
 use super::core::HttpCore;
 use super::error::parse_error;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::HttpConfig;
 use crate::*;
-
 impl Configurator for HttpConfig {
     type Builder = HttpBuilder;
 
@@ -129,7 +129,6 @@ impl HttpBuilder {
 }
 
 impl Builder for HttpBuilder {
-    const SCHEME: Scheme = Scheme::Http;
     type Config = HttpConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -158,7 +157,7 @@ impl Builder for HttpBuilder {
         }
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Http)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/http/mod.rs b/core/src/services/http/mod.rs
index fef894ef1..923d25588 100644
--- a/core/src/services/http/mod.rs
+++ b/core/src/services/http/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for http service.
+#[cfg(feature = "services-http")]
+pub(super) const DEFAULT_SCHEME: &str = "http";
 #[cfg(feature = "services-http")]
 mod error;
 
diff --git a/core/src/services/huggingface/backend.rs 
b/core/src/services/huggingface/backend.rs
index 43aad0156..2c7c436e0 100644
--- a/core/src/services/huggingface/backend.rs
+++ b/core/src/services/huggingface/backend.rs
@@ -28,10 +28,10 @@ use super::core::HuggingfaceCore;
 use super::core::HuggingfaceStatus;
 use super::error::parse_error;
 use super::lister::HuggingfaceLister;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::HuggingfaceConfig;
 use crate::*;
-
 impl Configurator for HuggingfaceConfig {
     type Builder = HuggingfaceBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -126,7 +126,6 @@ impl HuggingfaceBuilder {
 }
 
 impl Builder for HuggingfaceBuilder {
-    const SCHEME: Scheme = Scheme::Huggingface;
     type Config = HuggingfaceConfig;
 
     /// Build a HuggingfaceBackend.
@@ -173,7 +172,7 @@ impl Builder for HuggingfaceBuilder {
             core: Arc::new(HuggingfaceCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Huggingface)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_native_capability(Capability {
                             stat: true,
 
diff --git a/core/src/services/huggingface/mod.rs 
b/core/src/services/huggingface/mod.rs
index 011fba471..bcf7ff9d7 100644
--- a/core/src/services/huggingface/mod.rs
+++ b/core/src/services/huggingface/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for huggingface service.
+#[cfg(feature = "services-huggingface")]
+pub(super) const DEFAULT_SCHEME: &str = "huggingface";
 #[cfg(feature = "services-huggingface")]
 mod core;
 #[cfg(feature = "services-huggingface")]
diff --git a/core/src/services/ipfs/backend.rs 
b/core/src/services/ipfs/backend.rs
index c8877c6cf..39df3a2ee 100644
--- a/core/src/services/ipfs/backend.rs
+++ b/core/src/services/ipfs/backend.rs
@@ -27,10 +27,10 @@ use prost::Message;
 use super::core::IpfsCore;
 use super::error::parse_error;
 use super::ipld::PBNode;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::IpfsConfig;
 use crate::*;
-
 impl Configurator for IpfsConfig {
     type Builder = IpfsBuilder;
 
@@ -106,7 +106,6 @@ impl IpfsBuilder {
 }
 
 impl Builder for IpfsBuilder {
-    const SCHEME: Scheme = Scheme::Ipfs;
     type Config = IpfsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -132,7 +131,7 @@ impl Builder for IpfsBuilder {
         debug!("backend use endpoint {}", &endpoint);
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Ipfs)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/ipfs/mod.rs b/core/src/services/ipfs/mod.rs
index ade100c5f..93617c2ba 100644
--- a/core/src/services/ipfs/mod.rs
+++ b/core/src/services/ipfs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for ipfs service.
+#[cfg(feature = "services-ipfs")]
+pub(super) const DEFAULT_SCHEME: &str = "ipfs";
 #[cfg(feature = "services-ipfs")]
 mod error;
 #[cfg(feature = "services-ipfs")]
diff --git a/core/src/services/ipmfs/builder.rs 
b/core/src/services/ipmfs/builder.rs
index f87fa2715..024d67f7e 100644
--- a/core/src/services/ipmfs/builder.rs
+++ b/core/src/services/ipmfs/builder.rs
@@ -21,10 +21,10 @@ use log::debug;
 
 use super::backend::IpmfsBackend;
 use super::core::IpmfsCore;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::IpmfsConfig;
 use crate::*;
-
 impl Configurator for IpmfsConfig {
     type Builder = IpmfsBuilder;
 
@@ -124,7 +124,6 @@ impl IpmfsBuilder {
 }
 
 impl Builder for IpmfsBuilder {
-    const SCHEME: Scheme = Scheme::Ipmfs;
     type Config = IpmfsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -138,7 +137,7 @@ impl Builder for IpmfsBuilder {
             .unwrap_or_else(|| "http://localhost:5001".to_string());
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Ipmfs)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/ipmfs/mod.rs b/core/src/services/ipmfs/mod.rs
index ca70f362b..4fe389028 100644
--- a/core/src/services/ipmfs/mod.rs
+++ b/core/src/services/ipmfs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for ipmfs service.
+#[cfg(feature = "services-ipmfs")]
+pub(super) const DEFAULT_SCHEME: &str = "ipmfs";
 #[cfg(feature = "services-ipmfs")]
 mod backend;
 #[cfg(feature = "services-ipmfs")]
diff --git a/core/src/services/koofr/backend.rs 
b/core/src/services/koofr/backend.rs
index 99b7b8d19..2c9f64bb4 100644
--- a/core/src/services/koofr/backend.rs
+++ b/core/src/services/koofr/backend.rs
@@ -34,10 +34,10 @@ use super::error::parse_error;
 use super::lister::KoofrLister;
 use super::writer::KoofrWriter;
 use super::writer::KoofrWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::KoofrConfig;
 use crate::*;
-
 impl Configurator for KoofrConfig {
     type Builder = KoofrBuilder;
 
@@ -136,7 +136,6 @@ impl KoofrBuilder {
 }
 
 impl Builder for KoofrBuilder {
-    const SCHEME: Scheme = Scheme::Koofr;
     type Config = KoofrConfig;
 
     /// Builds the backend and returns the result of KoofrBackend.
@@ -175,7 +174,7 @@ impl Builder for KoofrBuilder {
             core: Arc::new(KoofrCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Koofr)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/koofr/mod.rs b/core/src/services/koofr/mod.rs
index 255d6ff72..2339b6e0b 100644
--- a/core/src/services/koofr/mod.rs
+++ b/core/src/services/koofr/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for koofr service.
+#[cfg(feature = "services-koofr")]
+pub(super) const DEFAULT_SCHEME: &str = "koofr";
 #[cfg(feature = "services-koofr")]
 mod core;
 #[cfg(feature = "services-koofr")]
diff --git a/core/src/services/lakefs/backend.rs 
b/core/src/services/lakefs/backend.rs
index 732251841..ebd0b72ee 100644
--- a/core/src/services/lakefs/backend.rs
+++ b/core/src/services/lakefs/backend.rs
@@ -32,10 +32,10 @@ use super::delete::LakefsDeleter;
 use super::error::parse_error;
 use super::lister::LakefsLister;
 use super::writer::LakefsWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::LakefsConfig;
 use crate::*;
-
 impl Configurator for LakefsConfig {
     type Builder = LakefsBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -126,7 +126,6 @@ impl LakefsBuilder {
 }
 
 impl Builder for LakefsBuilder {
-    const SCHEME: Scheme = Scheme::Lakefs;
     type Config = LakefsConfig;
 
     /// Build a LakefsBackend.
@@ -176,7 +175,7 @@ impl Builder for LakefsBuilder {
             core: Arc::new(LakefsCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Lakefs)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_native_capability(Capability {
                             stat: true,
 
diff --git a/core/src/services/lakefs/mod.rs b/core/src/services/lakefs/mod.rs
index 01d161d46..0183e3d84 100644
--- a/core/src/services/lakefs/mod.rs
+++ b/core/src/services/lakefs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for lakefs service.
+#[cfg(feature = "services-lakefs")]
+pub(super) const DEFAULT_SCHEME: &str = "lakefs";
 #[cfg(feature = "services-lakefs")]
 mod core;
 #[cfg(feature = "services-lakefs")]
diff --git a/core/src/services/memcached/backend.rs 
b/core/src/services/memcached/backend.rs
index caa29cff1..23e5d2870 100644
--- a/core/src/services/memcached/backend.rs
+++ b/core/src/services/memcached/backend.rs
@@ -85,7 +85,6 @@ impl MemcachedBuilder {
 }
 
 impl Builder for MemcachedBuilder {
-    const SCHEME: Scheme = Scheme::Memcached;
     type Config = MemcachedConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/memory/backend.rs 
b/core/src/services/memory/backend.rs
index 48f5e07df..8c2b4b55f 100644
--- a/core/src/services/memory/backend.rs
+++ b/core/src/services/memory/backend.rs
@@ -22,11 +22,11 @@ use super::core::*;
 use super::delete::MemoryDeleter;
 use super::lister::MemoryLister;
 use super::writer::MemoryWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio;
 use crate::raw::*;
 use crate::services::MemoryConfig;
 use crate::*;
-
 impl Configurator for MemoryConfig {
     type Builder = MemoryBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -50,7 +50,6 @@ impl MemoryBuilder {
 }
 
 impl Builder for MemoryBuilder {
-    const SCHEME: Scheme = Scheme::Memory;
     type Config = MemoryConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -72,7 +71,7 @@ pub struct MemoryAccessor {
 impl MemoryAccessor {
     fn new(core: MemoryCore) -> Self {
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Memory);
+        info.set_scheme(DEFAULT_SCHEME);
         info.set_name(&format!("{:p}", Arc::as_ptr(&core.data)));
         info.set_root("/");
         info.set_native_capability(Capability {
diff --git a/core/src/services/memory/mod.rs b/core/src/services/memory/mod.rs
index cefcd972a..ef5c3f5eb 100644
--- a/core/src/services/memory/mod.rs
+++ b/core/src/services/memory/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for memory service.
+#[cfg(feature = "services-memory")]
+pub(super) const DEFAULT_SCHEME: &str = "memory";
 #[cfg(feature = "services-memory")]
 mod backend;
 #[cfg(feature = "services-memory")]
diff --git a/core/src/services/mini_moka/backend.rs 
b/core/src/services/mini_moka/backend.rs
index 042c627ed..2b28e468c 100644
--- a/core/src/services/mini_moka/backend.rs
+++ b/core/src/services/mini_moka/backend.rs
@@ -26,12 +26,12 @@ use super::core::*;
 use super::delete::MiniMokaDeleter;
 use super::lister::MiniMokaLister;
 use super::writer::MiniMokaWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio;
 use crate::raw::oio::HierarchyLister;
 use crate::raw::*;
 use crate::services::MiniMokaConfig;
 use crate::*;
-
 impl Configurator for MiniMokaConfig {
     type Builder = MiniMokaBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -103,7 +103,6 @@ impl MiniMokaBuilder {
 }
 
 impl Builder for MiniMokaBuilder {
-    const SCHEME: Scheme = Scheme::MiniMoka;
     type Config = MiniMokaConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -156,7 +155,7 @@ impl Access for MiniMokaBackend {
 
     fn info(&self) -> Arc<AccessorInfo> {
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::MiniMoka)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&self.root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/mini_moka/mod.rs 
b/core/src/services/mini_moka/mod.rs
index d6ac055cb..cff46e241 100644
--- a/core/src/services/mini_moka/mod.rs
+++ b/core/src/services/mini_moka/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for mini_moka service.
+#[cfg(feature = "services-mini-moka")]
+pub(super) const DEFAULT_SCHEME: &str = "mini_moka";
 #[cfg(feature = "services-mini-moka")]
 mod backend;
 #[cfg(feature = "services-mini-moka")]
diff --git a/core/src/services/moka/backend.rs 
b/core/src/services/moka/backend.rs
index a685ca12e..bf7181ddd 100644
--- a/core/src/services/moka/backend.rs
+++ b/core/src/services/moka/backend.rs
@@ -26,11 +26,11 @@ use super::core::*;
 use super::delete::MokaDeleter;
 use super::lister::MokaLister;
 use super::writer::MokaWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio;
 use crate::raw::*;
 use crate::services::MokaConfig;
 use crate::*;
-
 impl Configurator for MokaConfig {
     type Builder = MokaBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -151,7 +151,6 @@ impl MokaBuilder {
 }
 
 impl Builder for MokaBuilder {
-    const SCHEME: Scheme = Scheme::Moka;
     type Config = MokaConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -203,7 +202,7 @@ pub struct MokaAccessor {
 impl MokaAccessor {
     fn new(core: MokaCore) -> Self {
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Moka);
+        info.set_scheme(DEFAULT_SCHEME);
         info.set_name(core.cache.name().unwrap_or("moka"));
         info.set_root("/");
         info.set_native_capability(Capability {
diff --git a/core/src/services/moka/mod.rs b/core/src/services/moka/mod.rs
index c8acb8f23..ccbeb0cc2 100644
--- a/core/src/services/moka/mod.rs
+++ b/core/src/services/moka/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for moka service.
+#[cfg(feature = "services-moka")]
+pub(super) const DEFAULT_SCHEME: &str = "moka";
 #[cfg(feature = "services-moka")]
 mod backend;
 #[cfg(feature = "services-moka")]
diff --git a/core/src/services/mongodb/backend.rs 
b/core/src/services/mongodb/backend.rs
index a3edd88df..442b7d958 100644
--- a/core/src/services/mongodb/backend.rs
+++ b/core/src/services/mongodb/backend.rs
@@ -128,7 +128,6 @@ impl MongodbBuilder {
 }
 
 impl Builder for MongodbBuilder {
-    const SCHEME: Scheme = Scheme::Mongodb;
     type Config = MongodbConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/monoiofs/backend.rs 
b/core/src/services/monoiofs/backend.rs
index 0894f133f..ad2833fa4 100644
--- a/core/src/services/monoiofs/backend.rs
+++ b/core/src/services/monoiofs/backend.rs
@@ -61,7 +61,6 @@ impl MonoiofsBuilder {
 }
 
 impl Builder for MonoiofsBuilder {
-    const SCHEME: Scheme = Scheme::Monoiofs;
     type Config = MonoiofsConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/monoiofs/core.rs 
b/core/src/services/monoiofs/core.rs
index 0428719cb..830d32df5 100644
--- a/core/src/services/monoiofs/core.rs
+++ b/core/src/services/monoiofs/core.rs
@@ -28,9 +28,9 @@ use futures::Future;
 use monoio::FusionDriver;
 use monoio::RuntimeBuilder;
 
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::*;
-
 pub const BUFFER_SIZE: usize = 2 * 1024 * 1024; // 2 MiB
 
 /// a boxed function that spawns task in current monoio runtime
@@ -69,7 +69,7 @@ impl MonoiofsCore {
         Self {
             info: {
                 let am = AccessorInfo::default();
-                am.set_scheme(Scheme::Monoiofs)
+                am.set_scheme(DEFAULT_SCHEME)
                     .set_root(&root.to_string_lossy())
                     .set_native_capability(Capability {
                         stat: true,
diff --git a/core/src/services/monoiofs/mod.rs 
b/core/src/services/monoiofs/mod.rs
index e16954881..9dbcb06f9 100644
--- a/core/src/services/monoiofs/mod.rs
+++ b/core/src/services/monoiofs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for monoiofs service.
+#[cfg(feature = "services-monoiofs")]
+pub(super) const DEFAULT_SCHEME: &str = "monoiofs";
 #[cfg(feature = "services-monoiofs")]
 mod core;
 #[cfg(feature = "services-monoiofs")]
diff --git a/core/src/services/mysql/backend.rs 
b/core/src/services/mysql/backend.rs
index ad4ad4374..120ae4b58 100644
--- a/core/src/services/mysql/backend.rs
+++ b/core/src/services/mysql/backend.rs
@@ -113,7 +113,6 @@ impl MysqlBuilder {
 }
 
 impl Builder for MysqlBuilder {
-    const SCHEME: Scheme = Scheme::Mysql;
     type Config = MysqlConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs
index e88607f08..88e5f350d 100644
--- a/core/src/services/obs/backend.rs
+++ b/core/src/services/obs/backend.rs
@@ -35,10 +35,10 @@ use super::error::parse_error;
 use super::lister::ObsLister;
 use super::writer::ObsWriter;
 use super::writer::ObsWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::ObsConfig;
 use crate::*;
-
 impl Configurator for ObsConfig {
     type Builder = ObsBuilder;
 
@@ -154,7 +154,6 @@ impl ObsBuilder {
 }
 
 impl Builder for ObsBuilder {
-    const SCHEME: Scheme = Scheme::Obs;
     type Config = ObsConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -233,7 +232,7 @@ impl Builder for ObsBuilder {
             core: Arc::new(ObsCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Obs)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(&bucket)
                         .set_native_capability(Capability {
diff --git a/core/src/services/obs/mod.rs b/core/src/services/obs/mod.rs
index 3427da280..ed94697a1 100644
--- a/core/src/services/obs/mod.rs
+++ b/core/src/services/obs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for obs service.
+#[cfg(feature = "services-obs")]
+pub(super) const DEFAULT_SCHEME: &str = "obs";
 #[cfg(feature = "services-obs")]
 mod core;
 #[cfg(feature = "services-obs")]
diff --git a/core/src/services/onedrive/builder.rs 
b/core/src/services/onedrive/builder.rs
index 4d2d4c91d..85e969b1a 100644
--- a/core/src/services/onedrive/builder.rs
+++ b/core/src/services/onedrive/builder.rs
@@ -27,6 +27,7 @@ use services::onedrive::core::OneDriveSigner;
 use tokio::sync::Mutex;
 
 use super::backend::OnedriveBackend;
+use super::DEFAULT_SCHEME;
 use crate::raw::normalize_root;
 use crate::raw::Access;
 use crate::raw::AccessorInfo;
@@ -34,7 +35,6 @@ use crate::raw::HttpClient;
 use crate::services::OnedriveConfig;
 use crate::Scheme;
 use crate::*;
-
 impl Configurator for OnedriveConfig {
     type Builder = OnedriveBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -137,7 +137,6 @@ impl OnedriveBuilder {
 }
 
 impl Builder for OnedriveBuilder {
-    const SCHEME: Scheme = Scheme::Onedrive;
     type Config = OnedriveConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -145,7 +144,7 @@ impl Builder for OnedriveBuilder {
         debug!("backend use root {root}");
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Onedrive)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 read: true,
diff --git a/core/src/services/onedrive/mod.rs 
b/core/src/services/onedrive/mod.rs
index fadcfc9cb..cd1a892b4 100644
--- a/core/src/services/onedrive/mod.rs
+++ b/core/src/services/onedrive/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for onedrive service.
+#[cfg(feature = "services-onedrive")]
+pub(super) const DEFAULT_SCHEME: &str = "onedrive";
 #[cfg(feature = "services-onedrive")]
 mod backend;
 #[cfg(feature = "services-onedrive")]
diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs
index ec6ea73c0..b87502425 100644
--- a/core/src/services/oss/backend.rs
+++ b/core/src/services/oss/backend.rs
@@ -35,10 +35,10 @@ use super::lister::OssListers;
 use super::lister::OssObjectVersionsLister;
 use super::writer::OssWriter;
 use super::writer::OssWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::OssConfig;
 use crate::*;
-
 const DEFAULT_BATCH_MAX_OPERATIONS: usize = 1000;
 
 impl Configurator for OssConfig {
@@ -318,7 +318,6 @@ impl OssBuilder {
 }
 
 impl Builder for OssBuilder {
-    const SCHEME: Scheme = Scheme::Oss;
     type Config = OssConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -411,7 +410,7 @@ impl Builder for OssBuilder {
             core: Arc::new(OssCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Oss)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(bucket)
                         .set_native_capability(Capability {
diff --git a/core/src/services/oss/mod.rs b/core/src/services/oss/mod.rs
index 19b280e7b..e27e6a78b 100644
--- a/core/src/services/oss/mod.rs
+++ b/core/src/services/oss/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for oss service.
+#[cfg(feature = "services-oss")]
+pub(super) const DEFAULT_SCHEME: &str = "oss";
 #[cfg(feature = "services-oss")]
 mod core;
 #[cfg(feature = "services-oss")]
diff --git a/core/src/services/pcloud/backend.rs 
b/core/src/services/pcloud/backend.rs
index 6caaaeb4c..7c84f3b72 100644
--- a/core/src/services/pcloud/backend.rs
+++ b/core/src/services/pcloud/backend.rs
@@ -31,10 +31,10 @@ use super::error::PcloudError;
 use super::lister::PcloudLister;
 use super::writer::PcloudWriter;
 use super::writer::PcloudWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::PcloudConfig;
 use crate::*;
-
 impl Configurator for PcloudConfig {
     type Builder = PcloudBuilder;
 
@@ -132,7 +132,6 @@ impl PcloudBuilder {
 }
 
 impl Builder for PcloudBuilder {
-    const SCHEME: Scheme = Scheme::Pcloud;
     type Config = PcloudConfig;
 
     /// Builds the backend and returns the result of PcloudBackend.
@@ -169,7 +168,7 @@ impl Builder for PcloudBuilder {
             core: Arc::new(PcloudCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Pcloud)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/pcloud/mod.rs b/core/src/services/pcloud/mod.rs
index f42bdc162..139528f7f 100644
--- a/core/src/services/pcloud/mod.rs
+++ b/core/src/services/pcloud/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for pcloud service.
+#[cfg(feature = "services-pcloud")]
+pub(super) const DEFAULT_SCHEME: &str = "pcloud";
 #[cfg(feature = "services-pcloud")]
 mod core;
 #[cfg(feature = "services-pcloud")]
diff --git a/core/src/services/persy/backend.rs 
b/core/src/services/persy/backend.rs
index 934db41c8..f1cfdc725 100644
--- a/core/src/services/persy/backend.rs
+++ b/core/src/services/persy/backend.rs
@@ -65,7 +65,6 @@ impl PersyBuilder {
 }
 
 impl Builder for PersyBuilder {
-    const SCHEME: Scheme = Scheme::Persy;
     type Config = PersyConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/postgresql/backend.rs 
b/core/src/services/postgresql/backend.rs
index ab4570909..1214c3351 100644
--- a/core/src/services/postgresql/backend.rs
+++ b/core/src/services/postgresql/backend.rs
@@ -112,7 +112,6 @@ impl PostgresqlBuilder {
 }
 
 impl Builder for PostgresqlBuilder {
-    const SCHEME: Scheme = Scheme::Postgresql;
     type Config = PostgresqlConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/redb/backend.rs 
b/core/src/services/redb/backend.rs
index 31de507db..18c3d0b26 100644
--- a/core/src/services/redb/backend.rs
+++ b/core/src/services/redb/backend.rs
@@ -97,7 +97,6 @@ impl RedbBuilder {
 }
 
 impl Builder for RedbBuilder {
-    const SCHEME: Scheme = Scheme::Redb;
     type Config = RedbConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/redis/backend.rs 
b/core/src/services/redis/backend.rs
index e6817c493..db5def362 100644
--- a/core/src/services/redis/backend.rs
+++ b/core/src/services/redis/backend.rs
@@ -32,11 +32,11 @@ use tokio::sync::OnceCell;
 use super::core::*;
 use super::delete::RedisDeleter;
 use super::writer::RedisWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio;
 use crate::raw::*;
 use crate::services::RedisConfig;
 use crate::*;
-
 const DEFAULT_REDIS_ENDPOINT: &str = "tcp://127.0.0.1:6379";
 const DEFAULT_REDIS_PORT: u16 = 6379;
 
@@ -144,7 +144,6 @@ impl RedisBuilder {
 }
 
 impl Builder for RedisBuilder {
-    const SCHEME: Scheme = Scheme::Redis;
     type Config = RedisConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -278,7 +277,7 @@ pub struct RedisAccessor {
 impl RedisAccessor {
     fn new(core: RedisCore) -> Self {
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Redis);
+        info.set_scheme(DEFAULT_SCHEME);
         info.set_name(&core.addr);
         info.set_root("/");
         info.set_native_capability(Capability {
@@ -396,7 +395,7 @@ mod tests {
 
         // Verify basic properties
         assert_eq!(accessor.root, "/");
-        assert_eq!(accessor.info.scheme(), Scheme::Redis);
+        assert_eq!(accessor.info.scheme(), "redis");
         assert!(accessor.info.native_capability().read);
         assert!(accessor.info.native_capability().write);
         assert!(accessor.info.native_capability().delete);
diff --git a/core/src/services/redis/mod.rs b/core/src/services/redis/mod.rs
index 3d8975fae..dc187886b 100644
--- a/core/src/services/redis/mod.rs
+++ b/core/src/services/redis/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for redis service.
+#[cfg(feature = "services-redis")]
+pub(super) const DEFAULT_SCHEME: &str = "redis";
 #[cfg(feature = "services-redis")]
 mod backend;
 #[cfg(feature = "services-redis")]
diff --git a/core/src/services/rocksdb/backend.rs 
b/core/src/services/rocksdb/backend.rs
index 68c481ba5..bba240434 100644
--- a/core/src/services/rocksdb/backend.rs
+++ b/core/src/services/rocksdb/backend.rs
@@ -63,7 +63,6 @@ impl RocksdbBuilder {
 }
 
 impl Builder for RocksdbBuilder {
-    const SCHEME: Scheme = Scheme::Rocksdb;
     type Config = RocksdbConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs
index a36ff1a41..292e90690 100644
--- a/core/src/services/s3/backend.rs
+++ b/core/src/services/s3/backend.rs
@@ -50,6 +50,7 @@ use super::lister::S3Listers;
 use super::lister::S3ObjectVersionsLister;
 use super::writer::S3Writer;
 use super::writer::S3Writers;
+use super::DEFAULT_SCHEME;
 use crate::raw::oio::PageLister;
 use crate::raw::*;
 use crate::services::S3Config;
@@ -716,7 +717,6 @@ impl S3Builder {
 }
 
 impl Builder for S3Builder {
-    const SCHEME: Scheme = Scheme::S3;
     type Config = S3Config;
 
     fn build(mut self) -> Result<impl Access> {
@@ -904,7 +904,7 @@ impl Builder for S3Builder {
             core: Arc::new(S3Core {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::S3)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_name(bucket)
                         .set_native_capability(Capability {
diff --git a/core/src/services/s3/mod.rs b/core/src/services/s3/mod.rs
index 587a171e6..44f4a3982 100644
--- a/core/src/services/s3/mod.rs
+++ b/core/src/services/s3/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for s3 service.
+#[cfg(feature = "services-s3")]
+pub(super) const DEFAULT_SCHEME: &str = "s3";
 #[cfg(feature = "services-s3")]
 mod core;
 #[cfg(feature = "services-s3")]
diff --git a/core/src/services/seafile/backend.rs 
b/core/src/services/seafile/backend.rs
index 5c1dc21a5..43044e372 100644
--- a/core/src/services/seafile/backend.rs
+++ b/core/src/services/seafile/backend.rs
@@ -33,10 +33,10 @@ use super::error::parse_error;
 use super::lister::SeafileLister;
 use super::writer::SeafileWriter;
 use super::writer::SeafileWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::SeafileConfig;
 use crate::*;
-
 impl Configurator for SeafileConfig {
     type Builder = SeafileBuilder;
 
@@ -145,7 +145,6 @@ impl SeafileBuilder {
 }
 
 impl Builder for SeafileBuilder {
-    const SCHEME: Scheme = Scheme::Seafile;
     type Config = SeafileConfig;
 
     /// Builds the backend and returns the result of SeafileBackend.
@@ -189,7 +188,7 @@ impl Builder for SeafileBuilder {
             core: Arc::new(SeafileCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Seafile)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/seafile/mod.rs b/core/src/services/seafile/mod.rs
index 56c44acdd..e08c059cb 100644
--- a/core/src/services/seafile/mod.rs
+++ b/core/src/services/seafile/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for seafile service.
+#[cfg(feature = "services-seafile")]
+pub(super) const DEFAULT_SCHEME: &str = "seafile";
 #[cfg(feature = "services-seafile")]
 mod core;
 #[cfg(feature = "services-seafile")]
diff --git a/core/src/services/sftp/backend.rs 
b/core/src/services/sftp/backend.rs
index 96c5fa60d..93e31a128 100644
--- a/core/src/services/sftp/backend.rs
+++ b/core/src/services/sftp/backend.rs
@@ -35,10 +35,10 @@ use super::error::parse_sftp_error;
 use super::lister::SftpLister;
 use super::reader::SftpReader;
 use super::writer::SftpWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::SftpConfig;
 use crate::*;
-
 impl Configurator for SftpConfig {
     type Builder = SftpBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -141,7 +141,6 @@ impl SftpBuilder {
 }
 
 impl Builder for SftpBuilder {
-    const SCHEME: Scheme = Scheme::Sftp;
     type Config = SftpConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -181,7 +180,7 @@ impl Builder for SftpBuilder {
 
         let info = AccessorInfo::default();
         info.set_root(root.as_str())
-            .set_scheme(Scheme::Sftp)
+            .set_scheme(DEFAULT_SCHEME)
             .set_native_capability(Capability {
                 stat: true,
 
diff --git a/core/src/services/sftp/mod.rs b/core/src/services/sftp/mod.rs
index e3de30916..537edfd3e 100644
--- a/core/src/services/sftp/mod.rs
+++ b/core/src/services/sftp/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for sftp service.
+#[cfg(feature = "services-sftp")]
+pub(super) const DEFAULT_SCHEME: &str = "sftp";
 #[cfg(feature = "services-sftp")]
 mod delete;
 #[cfg(feature = "services-sftp")]
diff --git a/core/src/services/sled/backend.rs 
b/core/src/services/sled/backend.rs
index 3e366f363..7f9dd7306 100644
--- a/core/src/services/sled/backend.rs
+++ b/core/src/services/sled/backend.rs
@@ -79,7 +79,6 @@ impl SledBuilder {
 }
 
 impl Builder for SledBuilder {
-    const SCHEME: Scheme = Scheme::Sled;
     type Config = SledConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/sqlite/backend.rs 
b/core/src/services/sqlite/backend.rs
index cfda82bc1..5fac36b4d 100644
--- a/core/src/services/sqlite/backend.rs
+++ b/core/src/services/sqlite/backend.rs
@@ -121,7 +121,6 @@ impl SqliteBuilder {
 }
 
 impl Builder for SqliteBuilder {
-    const SCHEME: Scheme = Scheme::Sqlite;
     type Config = SqliteConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/surrealdb/backend.rs 
b/core/src/services/surrealdb/backend.rs
index 3026a9c4e..8192815fb 100644
--- a/core/src/services/surrealdb/backend.rs
+++ b/core/src/services/surrealdb/backend.rs
@@ -144,7 +144,6 @@ impl SurrealdbBuilder {
 }
 
 impl Builder for SurrealdbBuilder {
-    const SCHEME: Scheme = Scheme::Surrealdb;
     type Config = SurrealdbConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/swift/backend.rs 
b/core/src/services/swift/backend.rs
index d48704b84..3320d98db 100644
--- a/core/src/services/swift/backend.rs
+++ b/core/src/services/swift/backend.rs
@@ -28,10 +28,10 @@ use super::delete::SwfitDeleter;
 use super::error::parse_error;
 use super::lister::SwiftLister;
 use super::writer::SwiftWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::SwiftConfig;
 use crate::*;
-
 impl Configurator for SwiftConfig {
     type Builder = SwiftBuilder;
     fn into_builder(self) -> Self::Builder {
@@ -113,7 +113,6 @@ impl SwiftBuilder {
 }
 
 impl Builder for SwiftBuilder {
-    const SCHEME: Scheme = Scheme::Swift;
     type Config = SwiftConfig;
 
     /// Build a SwiftBackend.
@@ -156,7 +155,7 @@ impl Builder for SwiftBuilder {
             core: Arc::new(SwiftCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Swift)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/swift/mod.rs b/core/src/services/swift/mod.rs
index 244d8f915..0928a0132 100644
--- a/core/src/services/swift/mod.rs
+++ b/core/src/services/swift/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for swift service.
+#[cfg(feature = "services-swift")]
+pub(super) const DEFAULT_SCHEME: &str = "swift";
 #[cfg(feature = "services-swift")]
 mod core;
 #[cfg(feature = "services-swift")]
diff --git a/core/src/services/tikv/backend.rs 
b/core/src/services/tikv/backend.rs
index 799a811a7..77789087c 100644
--- a/core/src/services/tikv/backend.rs
+++ b/core/src/services/tikv/backend.rs
@@ -96,7 +96,6 @@ impl TikvBuilder {
 }
 
 impl Builder for TikvBuilder {
-    const SCHEME: Scheme = Scheme::Tikv;
     type Config = TikvConfig;
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/services/upyun/backend.rs 
b/core/src/services/upyun/backend.rs
index 1548bf83d..5154f6f83 100644
--- a/core/src/services/upyun/backend.rs
+++ b/core/src/services/upyun/backend.rs
@@ -29,10 +29,10 @@ use super::error::parse_error;
 use super::lister::UpyunLister;
 use super::writer::UpyunWriter;
 use super::writer::UpyunWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::UpyunConfig;
 use crate::*;
-
 impl Configurator for UpyunConfig {
     type Builder = UpyunBuilder;
 
@@ -128,7 +128,6 @@ impl UpyunBuilder {
 }
 
 impl Builder for UpyunBuilder {
-    const SCHEME: Scheme = Scheme::Upyun;
     type Config = UpyunConfig;
 
     /// Builds the backend and returns the result of UpyunBackend.
@@ -170,7 +169,7 @@ impl Builder for UpyunBuilder {
             core: Arc::new(UpyunCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::Upyun)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/upyun/mod.rs b/core/src/services/upyun/mod.rs
index 694faf301..eee374681 100644
--- a/core/src/services/upyun/mod.rs
+++ b/core/src/services/upyun/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for upyun service.
+#[cfg(feature = "services-upyun")]
+pub(super) const DEFAULT_SCHEME: &str = "upyun";
 #[cfg(feature = "services-upyun")]
 mod core;
 #[cfg(feature = "services-upyun")]
diff --git a/core/src/services/vercel_artifacts/builder.rs 
b/core/src/services/vercel_artifacts/builder.rs
index 298866172..c0c3d144d 100644
--- a/core/src/services/vercel_artifacts/builder.rs
+++ b/core/src/services/vercel_artifacts/builder.rs
@@ -21,13 +21,12 @@ use std::sync::Arc;
 
 use super::backend::VercelArtifactsBackend;
 use super::core::VercelArtifactsCore;
+use super::DEFAULT_SCHEME;
 use crate::raw::Access;
 use crate::raw::AccessorInfo;
 use crate::raw::HttpClient;
 use crate::services::VercelArtifactsConfig;
-use crate::Scheme;
 use crate::*;
-
 impl Configurator for VercelArtifactsConfig {
     type Builder = VercelArtifactsBuilder;
 
@@ -82,12 +81,11 @@ impl VercelArtifactsBuilder {
 }
 
 impl Builder for VercelArtifactsBuilder {
-    const SCHEME: Scheme = Scheme::VercelArtifacts;
     type Config = VercelArtifactsConfig;
 
     fn build(self) -> Result<impl Access> {
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::VercelArtifacts)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_native_capability(Capability {
                 stat: true,
 
diff --git a/core/src/services/vercel_artifacts/mod.rs 
b/core/src/services/vercel_artifacts/mod.rs
index 2fe5a21db..086f792c0 100644
--- a/core/src/services/vercel_artifacts/mod.rs
+++ b/core/src/services/vercel_artifacts/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for vercel_artifacts service.
+#[cfg(feature = "services-vercel-artifacts")]
+pub(super) const DEFAULT_SCHEME: &str = "vercel_artifacts";
 #[cfg(feature = "services-vercel-artifacts")]
 mod backend;
 #[cfg(feature = "services-vercel-artifacts")]
diff --git a/core/src/services/vercel_blob/backend.rs 
b/core/src/services/vercel_blob/backend.rs
index 60aeeeb3d..2cfbb02d8 100644
--- a/core/src/services/vercel_blob/backend.rs
+++ b/core/src/services/vercel_blob/backend.rs
@@ -32,10 +32,10 @@ use super::error::parse_error;
 use super::lister::VercelBlobLister;
 use super::writer::VercelBlobWriter;
 use super::writer::VercelBlobWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::VercelBlobConfig;
 use crate::*;
-
 impl Configurator for VercelBlobConfig {
     type Builder = VercelBlobBuilder;
 
@@ -107,7 +107,6 @@ impl VercelBlobBuilder {
 }
 
 impl Builder for VercelBlobBuilder {
-    const SCHEME: Scheme = Scheme::VercelBlob;
     type Config = VercelBlobConfig;
 
     /// Builds the backend and returns the result of VercelBlobBackend.
@@ -128,7 +127,7 @@ impl Builder for VercelBlobBuilder {
             core: Arc::new(VercelBlobCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::VercelBlob)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/vercel_blob/mod.rs 
b/core/src/services/vercel_blob/mod.rs
index 8d466452a..cb2aed418 100644
--- a/core/src/services/vercel_blob/mod.rs
+++ b/core/src/services/vercel_blob/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for vercel_blob service.
+#[cfg(feature = "services-vercel-blob")]
+pub(super) const DEFAULT_SCHEME: &str = "vercel_blob";
 #[cfg(feature = "services-vercel-blob")]
 mod core;
 #[cfg(feature = "services-vercel-blob")]
diff --git a/core/src/services/webdav/backend.rs 
b/core/src/services/webdav/backend.rs
index c88b711d1..c887062e6 100644
--- a/core/src/services/webdav/backend.rs
+++ b/core/src/services/webdav/backend.rs
@@ -29,10 +29,10 @@ use super::delete::WebdavDeleter;
 use super::error::parse_error;
 use super::lister::WebdavLister;
 use super::writer::WebdavWriter;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::WebdavConfig;
 use crate::*;
-
 impl Configurator for WebdavConfig {
     type Builder = WebdavBuilder;
 
@@ -135,7 +135,6 @@ impl WebdavBuilder {
 }
 
 impl Builder for WebdavBuilder {
-    const SCHEME: Scheme = Scheme::Webdav;
     type Config = WebdavConfig;
 
     fn build(self) -> Result<impl Access> {
@@ -176,7 +175,7 @@ impl Builder for WebdavBuilder {
         let core = Arc::new(WebdavCore {
             info: {
                 let am = AccessorInfo::default();
-                am.set_scheme(Scheme::Webdav)
+                am.set_scheme(DEFAULT_SCHEME)
                     .set_root(&root)
                     .set_native_capability(Capability {
                         stat: true,
diff --git a/core/src/services/webdav/mod.rs b/core/src/services/webdav/mod.rs
index ae95bc94f..20ba1d3dc 100644
--- a/core/src/services/webdav/mod.rs
+++ b/core/src/services/webdav/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for webdav service.
+#[cfg(feature = "services-webdav")]
+pub(super) const DEFAULT_SCHEME: &str = "webdav";
 #[cfg(feature = "services-webdav")]
 mod core;
 #[cfg(feature = "services-webdav")]
diff --git a/core/src/services/webhdfs/backend.rs 
b/core/src/services/webhdfs/backend.rs
index 8f8ca704f..80039a685 100644
--- a/core/src/services/webhdfs/backend.rs
+++ b/core/src/services/webhdfs/backend.rs
@@ -34,10 +34,10 @@ use super::message::FileStatusType;
 use super::message::FileStatusWrapper;
 use super::writer::WebhdfsWriter;
 use super::writer::WebhdfsWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::WebhdfsConfig;
 use crate::*;
-
 const WEBHDFS_DEFAULT_ENDPOINT: &str = "http://127.0.0.1:9870";;
 
 impl Configurator for WebhdfsConfig {
@@ -147,7 +147,6 @@ impl WebhdfsBuilder {
 }
 
 impl Builder for WebhdfsBuilder {
-    const SCHEME: Scheme = Scheme::Webhdfs;
     type Config = WebhdfsConfig;
 
     /// build the backend
@@ -181,7 +180,7 @@ impl Builder for WebhdfsBuilder {
         let auth = self.config.delegation.map(|dt| format!("delegation={dt}"));
 
         let info = AccessorInfo::default();
-        info.set_scheme(Scheme::Webhdfs)
+        info.set_scheme(DEFAULT_SCHEME)
             .set_root(&root)
             .set_native_capability(Capability {
                 stat: true,
diff --git a/core/src/services/webhdfs/mod.rs b/core/src/services/webhdfs/mod.rs
index 52b9527a3..4336f2eb6 100644
--- a/core/src/services/webhdfs/mod.rs
+++ b/core/src/services/webhdfs/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for webhdfs service.
+#[cfg(feature = "services-webhdfs")]
+pub(super) const DEFAULT_SCHEME: &str = "webhdfs";
 #[cfg(feature = "services-webhdfs")]
 mod delete;
 #[cfg(feature = "services-webhdfs")]
diff --git a/core/src/services/yandex_disk/backend.rs 
b/core/src/services/yandex_disk/backend.rs
index 79b1dcf16..fac129c12 100644
--- a/core/src/services/yandex_disk/backend.rs
+++ b/core/src/services/yandex_disk/backend.rs
@@ -30,10 +30,10 @@ use super::error::parse_error;
 use super::lister::YandexDiskLister;
 use super::writer::YandexDiskWriter;
 use super::writer::YandexDiskWriters;
+use super::DEFAULT_SCHEME;
 use crate::raw::*;
 use crate::services::YandexDiskConfig;
 use crate::*;
-
 impl Configurator for YandexDiskConfig {
     type Builder = YandexDiskBuilder;
 
@@ -104,7 +104,6 @@ impl YandexDiskBuilder {
 }
 
 impl Builder for YandexDiskBuilder {
-    const SCHEME: Scheme = Scheme::YandexDisk;
     type Config = YandexDiskConfig;
 
     /// Builds the backend and returns the result of YandexDiskBackend.
@@ -127,7 +126,7 @@ impl Builder for YandexDiskBuilder {
             core: Arc::new(YandexDiskCore {
                 info: {
                     let am = AccessorInfo::default();
-                    am.set_scheme(Scheme::YandexDisk)
+                    am.set_scheme(DEFAULT_SCHEME)
                         .set_root(&root)
                         .set_native_capability(Capability {
                             stat: true,
diff --git a/core/src/services/yandex_disk/mod.rs 
b/core/src/services/yandex_disk/mod.rs
index f643bb722..7e2129491 100644
--- a/core/src/services/yandex_disk/mod.rs
+++ b/core/src/services/yandex_disk/mod.rs
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+/// Default scheme for yandex_disk service.
+#[cfg(feature = "services-yandex-disk")]
+pub(super) const DEFAULT_SCHEME: &str = "yandex_disk";
 #[cfg(feature = "services-yandex-disk")]
 mod core;
 #[cfg(feature = "services-yandex-disk")]
diff --git a/core/src/types/builder.rs b/core/src/types/builder.rs
index 43b05e582..3490913cb 100644
--- a/core/src/types/builder.rs
+++ b/core/src/types/builder.rs
@@ -49,8 +49,6 @@ use crate::*;
 /// }
 /// ```
 pub trait Builder: Default + 'static {
-    /// Associated scheme for this builder. It indicates what underlying 
service is.
-    const SCHEME: Scheme;
     /// Associated configuration for this builder.
     type Config: Configurator;
 
@@ -60,7 +58,6 @@ pub trait Builder: Default + 'static {
 
 /// Dummy implementation of builder
 impl Builder for () {
-    const SCHEME: Scheme = Scheme::Custom("dummy");
     type Config = ();
 
     fn build(self) -> Result<impl Access> {
diff --git a/core/src/types/operator/info.rs b/core/src/types/operator/info.rs
index dfe7b298c..2e483f450 100644
--- a/core/src/types/operator/info.rs
+++ b/core/src/types/operator/info.rs
@@ -15,6 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::str::FromStr;
 use std::sync::Arc;
 
 use crate::raw::*;
@@ -31,7 +32,8 @@ impl OperatorInfo {
 
     /// [`Scheme`] of operator.
     pub fn scheme(&self) -> Scheme {
-        self.0.scheme()
+        let scheme_str = self.0.scheme();
+        Scheme::from_str(scheme_str).unwrap_or(Scheme::Custom(scheme_str))
     }
 
     /// Root of operator, will be in format like `/path/to/dir/`
diff --git a/core/src/types/operator/operator.rs 
b/core/src/types/operator/operator.rs
index 90f1bd8b2..f27306f3a 100644
--- a/core/src/types/operator/operator.rs
+++ b/core/src/types/operator/operator.rs
@@ -1004,7 +1004,7 @@ impl Operator {
             return Err(
                 Error::new(ErrorKind::IsADirectory, "write path is a 
directory")
                     .with_operation("Operator::writer")
-                    .with_context("service", acc.info().scheme().into_static())
+                    .with_context("service", acc.info().scheme())
                     .with_context("path", &path),
             );
         }

Reply via email to