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.
