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

xuanwo pushed a commit to branch xuanwo/operator-from-uri
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit f532240fccad67bf7f2f0ad11fd7480b0ced8661
Author: Xuanwo <[email protected]>
AuthorDate: Thu Dec 4 14:45:36 2025 +0800

    refactor: Reuse from_uri logic inside via iter
    
    Signed-off-by: Xuanwo <[email protected]>
---
 core/core/src/types/operator/builder.rs  | 158 +++----------------------------
 core/core/src/types/operator/registry.rs | 116 +++++++++++++++++++++--
 2 files changed, 123 insertions(+), 151 deletions(-)

diff --git a/core/core/src/types/operator/builder.rs 
b/core/core/src/types/operator/builder.rs
index 76055ac52..3de6ebc15 100644
--- a/core/core/src/types/operator/builder.rs
+++ b/core/core/src/types/operator/builder.rs
@@ -179,154 +179,13 @@ impl Operator {
     ///     Ok(())
     /// }
     /// ```
-    #[allow(unused_variables, unreachable_code)]
     pub fn via_iter(
         scheme: impl AsRef<str>,
         iter: impl IntoIterator<Item = (String, String)>,
     ) -> Result<Operator> {
-        let op = match scheme.as_ref() {
-            #[cfg(feature = "services-aliyun-drive")]
-            services::ALIYUN_DRIVE_SCHEME => {
-                Self::from_iter::<services::AliyunDrive>(iter)?.finish()
-            }
-            #[cfg(feature = "services-alluxio")]
-            services::ALLUXIO_SCHEME => 
Self::from_iter::<services::Alluxio>(iter)?.finish(),
-            #[cfg(feature = "services-azblob")]
-            services::AZBLOB_SCHEME => 
Self::from_iter::<services::Azblob>(iter)?.finish(),
-            #[cfg(feature = "services-azdls")]
-            services::AZDLS_SCHEME => 
Self::from_iter::<services::Azdls>(iter)?.finish(),
-            #[cfg(feature = "services-azfile")]
-            services::AZFILE_SCHEME => 
Self::from_iter::<services::Azfile>(iter)?.finish(),
-            #[cfg(feature = "services-b2")]
-            services::B2_SCHEME => 
Self::from_iter::<services::B2>(iter)?.finish(),
-            #[cfg(feature = "services-cacache")]
-            services::CACACHE_SCHEME => 
Self::from_iter::<services::Cacache>(iter)?.finish(),
-            #[cfg(feature = "services-cloudflare-kv")]
-            services::CLOUDFLARE_KV_SCHEME => {
-                Self::from_iter::<services::CloudflareKv>(iter)?.finish()
-            }
-            #[cfg(feature = "services-compfs")]
-            services::COMPFS_SCHEME => 
Self::from_iter::<services::Compfs>(iter)?.finish(),
-            #[cfg(feature = "services-cos")]
-            services::COS_SCHEME => 
Self::from_iter::<services::Cos>(iter)?.finish(),
-            #[cfg(feature = "services-d1")]
-            services::D1_SCHEME => 
Self::from_iter::<services::D1>(iter)?.finish(),
-            #[cfg(feature = "services-dashmap")]
-            services::DASHMAP_SCHEME => 
Self::from_iter::<services::Dashmap>(iter)?.finish(),
-            #[cfg(feature = "services-dbfs")]
-            services::DBFS_SCHEME => 
Self::from_iter::<services::Dbfs>(iter)?.finish(),
-            #[cfg(feature = "services-dropbox")]
-            services::DROPBOX_SCHEME => 
Self::from_iter::<services::Dropbox>(iter)?.finish(),
-            #[cfg(feature = "services-etcd")]
-            services::ETCD_SCHEME => 
Self::from_iter::<services::Etcd>(iter)?.finish(),
-            #[cfg(feature = "services-foundationdb")]
-            services::FOUNDATIONDB_SCHEME => {
-                Self::from_iter::<services::Foundationdb>(iter)?.finish()
-            }
-            #[cfg(feature = "services-fs")]
-            services::FS_SCHEME => 
Self::from_iter::<services::Fs>(iter)?.finish(),
-            #[cfg(feature = "services-ftp")]
-            services::FTP_SCHEME => 
Self::from_iter::<services::Ftp>(iter)?.finish(),
-            #[cfg(feature = "services-gcs")]
-            services::GCS_SCHEME => 
Self::from_iter::<services::Gcs>(iter)?.finish(),
-            #[cfg(feature = "services-gdrive")]
-            services::GDRIVE_SCHEME => 
Self::from_iter::<services::Gdrive>(iter)?.finish(),
-            #[cfg(feature = "services-ghac")]
-            services::GHAC_SCHEME => 
Self::from_iter::<services::Ghac>(iter)?.finish(),
-            #[cfg(feature = "services-github")]
-            services::GITHUB_SCHEME => 
Self::from_iter::<services::Github>(iter)?.finish(),
-            #[cfg(feature = "services-gridfs")]
-            services::GRIDFS_SCHEME => 
Self::from_iter::<services::Gridfs>(iter)?.finish(),
-            #[cfg(feature = "services-hdfs")]
-            services::HDFS_SCHEME => 
Self::from_iter::<services::Hdfs>(iter)?.finish(),
-            #[cfg(feature = "services-hdfs-native")]
-            services::HDFS_NATIVE_SCHEME => 
Self::from_iter::<services::HdfsNative>(iter)?.finish(),
-            #[cfg(feature = "services-http")]
-            services::HTTP_SCHEME => 
Self::from_iter::<services::Http>(iter)?.finish(),
-            #[cfg(feature = "services-huggingface")]
-            services::HUGGINGFACE_SCHEME => {
-                Self::from_iter::<services::Huggingface>(iter)?.finish()
-            }
-            #[cfg(feature = "services-ipfs")]
-            services::IPFS_SCHEME => 
Self::from_iter::<services::Ipfs>(iter)?.finish(),
-            #[cfg(feature = "services-ipmfs")]
-            services::IPMFS_SCHEME => 
Self::from_iter::<services::Ipmfs>(iter)?.finish(),
-            #[cfg(feature = "services-koofr")]
-            services::KOOFR_SCHEME => 
Self::from_iter::<services::Koofr>(iter)?.finish(),
-            #[cfg(feature = "services-lakefs")]
-            services::LAKEFS_SCHEME => 
Self::from_iter::<services::Lakefs>(iter)?.finish(),
-            #[cfg(feature = "services-memcached")]
-            services::MEMCACHED_SCHEME => 
Self::from_iter::<services::Memcached>(iter)?.finish(),
-            #[cfg(feature = "services-memory")]
-            services::MEMORY_SCHEME => 
Self::from_iter::<services::Memory>(iter)?.finish(),
-            #[cfg(feature = "services-mini-moka")]
-            services::MINI_MOKA_SCHEME => 
Self::from_iter::<services::MiniMoka>(iter)?.finish(),
-            #[cfg(feature = "services-moka")]
-            services::MOKA_SCHEME => 
Self::from_iter::<services::Moka>(iter)?.finish(),
-            #[cfg(feature = "services-mongodb")]
-            services::MONGODB_SCHEME => 
Self::from_iter::<services::Mongodb>(iter)?.finish(),
-            #[cfg(feature = "services-monoiofs")]
-            services::MONOIOFS_SCHEME => 
Self::from_iter::<services::Monoiofs>(iter)?.finish(),
-            #[cfg(feature = "services-mysql")]
-            services::MYSQL_SCHEME => 
Self::from_iter::<services::Mysql>(iter)?.finish(),
-            #[cfg(feature = "services-obs")]
-            services::OBS_SCHEME => 
Self::from_iter::<services::Obs>(iter)?.finish(),
-            #[cfg(feature = "services-onedrive")]
-            services::ONEDRIVE_SCHEME => 
Self::from_iter::<services::Onedrive>(iter)?.finish(),
-            #[cfg(feature = "services-oss")]
-            services::OSS_SCHEME => 
Self::from_iter::<services::Oss>(iter)?.finish(),
-            #[cfg(feature = "services-pcloud")]
-            services::PCLOUD_SCHEME => 
Self::from_iter::<services::Pcloud>(iter)?.finish(),
-            #[cfg(feature = "services-persy")]
-            services::PERSY_SCHEME => 
Self::from_iter::<services::Persy>(iter)?.finish(),
-            #[cfg(feature = "services-postgresql")]
-            services::POSTGRESQL_SCHEME => 
Self::from_iter::<services::Postgresql>(iter)?.finish(),
-            #[cfg(feature = "services-redb")]
-            services::REDB_SCHEME => 
Self::from_iter::<services::Redb>(iter)?.finish(),
-            #[cfg(feature = "services-redis")]
-            services::REDIS_SCHEME => 
Self::from_iter::<services::Redis>(iter)?.finish(),
-            #[cfg(feature = "services-rocksdb")]
-            services::ROCKSDB_SCHEME => 
Self::from_iter::<services::Rocksdb>(iter)?.finish(),
-            #[cfg(feature = "services-s3")]
-            services::S3_SCHEME => 
Self::from_iter::<services::S3>(iter)?.finish(),
-            #[cfg(feature = "services-seafile")]
-            services::SEAFILE_SCHEME => 
Self::from_iter::<services::Seafile>(iter)?.finish(),
-            #[cfg(feature = "services-sftp")]
-            services::SFTP_SCHEME => 
Self::from_iter::<services::Sftp>(iter)?.finish(),
-            #[cfg(feature = "services-sled")]
-            services::SLED_SCHEME => 
Self::from_iter::<services::Sled>(iter)?.finish(),
-            #[cfg(feature = "services-sqlite")]
-            services::SQLITE_SCHEME => 
Self::from_iter::<services::Sqlite>(iter)?.finish(),
-            #[cfg(feature = "services-surrealdb")]
-            services::SURREALDB_SCHEME => 
Self::from_iter::<services::Surrealdb>(iter)?.finish(),
-            #[cfg(feature = "services-swift")]
-            services::SWIFT_SCHEME => 
Self::from_iter::<services::Swift>(iter)?.finish(),
-            #[cfg(feature = "services-tikv")]
-            services::TIKV_SCHEME => 
Self::from_iter::<services::Tikv>(iter)?.finish(),
-            #[cfg(feature = "services-upyun")]
-            services::UPYUN_SCHEME => 
Self::from_iter::<services::Upyun>(iter)?.finish(),
-            #[cfg(feature = "services-vercel-artifacts")]
-            services::VERCEL_ARTIFACTS_SCHEME => {
-                Self::from_iter::<services::VercelArtifacts>(iter)?.finish()
-            }
-            #[cfg(feature = "services-vercel-blob")]
-            services::VERCEL_BLOB_SCHEME => 
Self::from_iter::<services::VercelBlob>(iter)?.finish(),
-            #[cfg(feature = "services-webdav")]
-            services::WEBDAV_SCHEME => 
Self::from_iter::<services::Webdav>(iter)?.finish(),
-            #[cfg(feature = "services-webhdfs")]
-            services::WEBHDFS_SCHEME => 
Self::from_iter::<services::Webhdfs>(iter)?.finish(),
-            #[cfg(feature = "services-yandex-disk")]
-            services::YANDEX_DISK_SCHEME => 
Self::from_iter::<services::YandexDisk>(iter)?.finish(),
-            v => {
-                return Err(Error::new(
-                    ErrorKind::Unsupported,
-                    "scheme is not enabled or supported",
-                )
-                .with_context("scheme", v));
-            }
-        };
+        let uri = (format!("{}:///", scheme.as_ref()), iter);
 
-        Ok(op)
+        Operator::from_uri(uri)
     }
 
     /// Create a new layer with dynamic dispatch.
@@ -470,3 +329,16 @@ impl<A: Access> OperatorBuilder<A> {
         Operator::from_inner(Arc::new(ob.accessor) as Accessor)
     }
 }
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::services;
+
+    #[test]
+    fn via_iter_delegates_to_registry() {
+        let op = Operator::via_iter(services::MEMORY_SCHEME, [])
+            .expect("memory scheme should be registered");
+        let _ = op;
+    }
+}
diff --git a/core/core/src/types/operator/registry.rs 
b/core/core/src/types/operator/registry.rs
index 4aedc77d7..d4dcf0f2a 100644
--- a/core/core/src/types/operator/registry.rs
+++ b/core/core/src/types/operator/registry.rs
@@ -77,28 +77,128 @@ impl OperatorRegistry {
 }
 
 fn register_builtin_services(registry: &OperatorRegistry) {
-    let _ = registry;
-
-    #[cfg(feature = "services-memory")]
-    
registry.register::<crate::services::Memory>(crate::services::MEMORY_SCHEME);
-    #[cfg(feature = "services-fs")]
-    registry.register::<crate::services::Fs>(crate::services::FS_SCHEME);
-    #[cfg(feature = "services-s3")]
-    registry.register::<crate::services::S3>(crate::services::S3_SCHEME);
+    #[cfg(feature = "services-aliyun-drive")]
+    
registry.register::<crate::services::AliyunDrive>(crate::services::ALIYUN_DRIVE_SCHEME);
+    #[cfg(feature = "services-alluxio")]
+    
registry.register::<crate::services::Alluxio>(crate::services::ALLUXIO_SCHEME);
     #[cfg(feature = "services-azblob")]
     
registry.register::<crate::services::Azblob>(crate::services::AZBLOB_SCHEME);
+    #[cfg(feature = "services-azdls")]
+    registry.register::<crate::services::Azdls>(crate::services::AZDLS_SCHEME);
+    #[cfg(feature = "services-azfile")]
+    
registry.register::<crate::services::Azfile>(crate::services::AZFILE_SCHEME);
     #[cfg(feature = "services-b2")]
     registry.register::<crate::services::B2>(crate::services::B2_SCHEME);
+    #[cfg(feature = "services-cacache")]
+    
registry.register::<crate::services::Cacache>(crate::services::CACACHE_SCHEME);
+    #[cfg(feature = "services-cloudflare-kv")]
+    
registry.register::<crate::services::CloudflareKv>(crate::services::CLOUDFLARE_KV_SCHEME);
+    #[cfg(feature = "services-compfs")]
+    
registry.register::<crate::services::Compfs>(crate::services::COMPFS_SCHEME);
     #[cfg(feature = "services-cos")]
     registry.register::<crate::services::Cos>(crate::services::COS_SCHEME);
+    #[cfg(feature = "services-d1")]
+    registry.register::<crate::services::D1>(crate::services::D1_SCHEME);
+    #[cfg(feature = "services-dashmap")]
+    
registry.register::<crate::services::Dashmap>(crate::services::DASHMAP_SCHEME);
+    #[cfg(feature = "services-dbfs")]
+    registry.register::<crate::services::Dbfs>(crate::services::DBFS_SCHEME);
+    #[cfg(feature = "services-dropbox")]
+    
registry.register::<crate::services::Dropbox>(crate::services::DROPBOX_SCHEME);
+    #[cfg(feature = "services-etcd")]
+    registry.register::<crate::services::Etcd>(crate::services::ETCD_SCHEME);
+    #[cfg(feature = "services-foundationdb")]
+    
registry.register::<crate::services::Foundationdb>(crate::services::FOUNDATIONDB_SCHEME);
+    #[cfg(feature = "services-fs")]
+    registry.register::<crate::services::Fs>(crate::services::FS_SCHEME);
+    #[cfg(feature = "services-ftp")]
+    registry.register::<crate::services::Ftp>(crate::services::FTP_SCHEME);
     #[cfg(feature = "services-gcs")]
     registry.register::<crate::services::Gcs>(crate::services::GCS_SCHEME);
+    #[cfg(feature = "services-gdrive")]
+    
registry.register::<crate::services::Gdrive>(crate::services::GDRIVE_SCHEME);
+    #[cfg(feature = "services-ghac")]
+    registry.register::<crate::services::Ghac>(crate::services::GHAC_SCHEME);
+    #[cfg(feature = "services-github")]
+    
registry.register::<crate::services::Github>(crate::services::GITHUB_SCHEME);
+    #[cfg(feature = "services-gridfs")]
+    
registry.register::<crate::services::Gridfs>(crate::services::GRIDFS_SCHEME);
+    #[cfg(feature = "services-hdfs")]
+    registry.register::<crate::services::Hdfs>(crate::services::HDFS_SCHEME);
+    #[cfg(feature = "services-hdfs-native")]
+    
registry.register::<crate::services::HdfsNative>(crate::services::HDFS_NATIVE_SCHEME);
+    #[cfg(feature = "services-http")]
+    registry.register::<crate::services::Http>(crate::services::HTTP_SCHEME);
+    #[cfg(feature = "services-huggingface")]
+    
registry.register::<crate::services::Huggingface>(crate::services::HUGGINGFACE_SCHEME);
+    #[cfg(feature = "services-ipfs")]
+    registry.register::<crate::services::Ipfs>(crate::services::IPFS_SCHEME);
+    #[cfg(feature = "services-ipmfs")]
+    registry.register::<crate::services::Ipmfs>(crate::services::IPMFS_SCHEME);
+    #[cfg(feature = "services-koofr")]
+    registry.register::<crate::services::Koofr>(crate::services::KOOFR_SCHEME);
+    #[cfg(feature = "services-lakefs")]
+    
registry.register::<crate::services::Lakefs>(crate::services::LAKEFS_SCHEME);
+    #[cfg(feature = "services-memcached")]
+    
registry.register::<crate::services::Memcached>(crate::services::MEMCACHED_SCHEME);
+    #[cfg(feature = "services-memory")]
+    
registry.register::<crate::services::Memory>(crate::services::MEMORY_SCHEME);
+    #[cfg(feature = "services-mini-moka")]
+    
registry.register::<crate::services::MiniMoka>(crate::services::MINI_MOKA_SCHEME);
+    #[cfg(feature = "services-moka")]
+    registry.register::<crate::services::Moka>(crate::services::MOKA_SCHEME);
+    #[cfg(feature = "services-mongodb")]
+    
registry.register::<crate::services::Mongodb>(crate::services::MONGODB_SCHEME);
+    #[cfg(feature = "services-monoiofs")]
+    
registry.register::<crate::services::Monoiofs>(crate::services::MONOIOFS_SCHEME);
+    #[cfg(feature = "services-mysql")]
+    registry.register::<crate::services::Mysql>(crate::services::MYSQL_SCHEME);
     #[cfg(feature = "services-obs")]
     registry.register::<crate::services::Obs>(crate::services::OBS_SCHEME);
+    #[cfg(feature = "services-onedrive")]
+    
registry.register::<crate::services::Onedrive>(crate::services::ONEDRIVE_SCHEME);
     #[cfg(feature = "services-oss")]
     registry.register::<crate::services::Oss>(crate::services::OSS_SCHEME);
+    #[cfg(feature = "services-pcloud")]
+    
registry.register::<crate::services::Pcloud>(crate::services::PCLOUD_SCHEME);
+    #[cfg(feature = "services-persy")]
+    registry.register::<crate::services::Persy>(crate::services::PERSY_SCHEME);
+    #[cfg(feature = "services-postgresql")]
+    
registry.register::<crate::services::Postgresql>(crate::services::POSTGRESQL_SCHEME);
+    #[cfg(feature = "services-redb")]
+    registry.register::<crate::services::Redb>(crate::services::REDB_SCHEME);
+    #[cfg(feature = "services-redis")]
+    registry.register::<crate::services::Redis>(crate::services::REDIS_SCHEME);
+    #[cfg(feature = "services-rocksdb")]
+    
registry.register::<crate::services::Rocksdb>(crate::services::ROCKSDB_SCHEME);
+    #[cfg(feature = "services-s3")]
+    registry.register::<crate::services::S3>(crate::services::S3_SCHEME);
+    #[cfg(feature = "services-seafile")]
+    
registry.register::<crate::services::Seafile>(crate::services::SEAFILE_SCHEME);
+    #[cfg(feature = "services-sftp")]
+    registry.register::<crate::services::Sftp>(crate::services::SFTP_SCHEME);
+    #[cfg(feature = "services-sled")]
+    registry.register::<crate::services::Sled>(crate::services::SLED_SCHEME);
+    #[cfg(feature = "services-sqlite")]
+    
registry.register::<crate::services::Sqlite>(crate::services::SQLITE_SCHEME);
+    #[cfg(feature = "services-surrealdb")]
+    
registry.register::<crate::services::Surrealdb>(crate::services::SURREALDB_SCHEME);
+    #[cfg(feature = "services-swift")]
+    registry.register::<crate::services::Swift>(crate::services::SWIFT_SCHEME);
+    #[cfg(feature = "services-tikv")]
+    registry.register::<crate::services::Tikv>(crate::services::TIKV_SCHEME);
     #[cfg(feature = "services-upyun")]
     registry.register::<crate::services::Upyun>(crate::services::UPYUN_SCHEME);
+    #[cfg(feature = "services-vercel-artifacts")]
+    
registry.register::<crate::services::VercelArtifacts>(crate::services::VERCEL_ARTIFACTS_SCHEME);
+    #[cfg(feature = "services-vercel-blob")]
+    
registry.register::<crate::services::VercelBlob>(crate::services::VERCEL_BLOB_SCHEME);
+    #[cfg(feature = "services-webdav")]
+    
registry.register::<crate::services::Webdav>(crate::services::WEBDAV_SCHEME);
+    #[cfg(feature = "services-webhdfs")]
+    
registry.register::<crate::services::Webhdfs>(crate::services::WEBHDFS_SCHEME);
+    #[cfg(feature = "services-yandex-disk")]
+    
registry.register::<crate::services::YandexDisk>(crate::services::YANDEX_DISK_SCHEME);
 }
 
 /// Factory adapter that builds an operator from a configurator type.

Reply via email to