This is an automated email from the ASF dual-hosted git repository. koushiro pushed a commit to branch remove-scheme-enum in repository https://gitbox.apache.org/repos/asf/opendal.git
commit 5ca6421d88b364c9b6ab6f235ec2c5de74acd7b2 Author: koushiro <[email protected]> AuthorDate: Sat Nov 8 21:25:17 2025 +0800 refactor(types): use string-based scheme over enum-based approach --- .../src/main.rs | 3 +- core/src/docs/internals/accessor.rs | 11 +- core/src/layers/async_backtrace.rs | 1 - core/src/layers/await_tree.rs | 1 - core/src/layers/capability_check.rs | 1 - core/src/layers/chaos.rs | 1 - core/src/layers/concurrent_limit.rs | 2 - core/src/layers/error_context.rs | 2 +- core/src/layers/logging.rs | 2 - core/src/layers/mime_guess.rs | 1 - core/src/layers/retry.rs | 3 - core/src/layers/throttle.rs | 1 - core/src/layers/timeout.rs | 1 - core/src/lib.rs | 1 - core/src/raw/tests/utils.rs | 6 +- core/src/types/context/read.rs | 5 +- core/src/types/mod.rs | 3 - core/src/types/operator/builder.rs | 175 ++++---- core/src/types/operator/info.rs | 8 +- core/src/types/operator/operator.rs | 2 - core/src/types/operator/operator_futures.rs | 5 - core/src/types/read/buffer_stream.rs | 4 +- core/src/types/read/futures_async_reader.rs | 8 +- core/src/types/read/futures_bytes_stream.rs | 6 +- core/src/types/read/reader.rs | 10 +- core/src/types/scheme.rs | 461 --------------------- core/src/types/write/buffer_sink.rs | 2 +- core/src/types/write/futures_async_writer.rs | 2 +- core/src/types/write/futures_bytes_sink.rs | 2 +- core/tests/behavior/async_copy.rs | 2 +- core/tests/behavior/async_delete.rs | 2 +- core/tests/behavior/async_list.rs | 4 +- core/tests/behavior/async_write.rs | 4 +- 33 files changed, 130 insertions(+), 612 deletions(-) diff --git a/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs b/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs index 5c3296918..333f3c200 100644 --- a/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +++ b/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs @@ -16,13 +16,12 @@ // under the License. use opendal::Result; -use opendal::Scheme; use opendal::raw::tests::init_test_service; #[tokio::main] async fn main() -> Result<()> { let op = init_test_service()?.expect("service must be init"); - assert_eq!(op.info().scheme(), Scheme::S3); + assert_eq!(op.info().scheme(), opendal::services::S3_SCHEME); let result = op .exists(&uuid::Uuid::new_v4().to_string()) diff --git a/core/src/docs/internals/accessor.rs b/core/src/docs/internals/accessor.rs index 08f2cbd6d..514937df8 100644 --- a/core/src/docs/internals/accessor.rs +++ b/core/src/docs/internals/accessor.rs @@ -119,7 +119,7 @@ //! //! ## Scheme //! -//! First of all, let's pick a good [`Scheme`] for our duck service. The +//! First of all, let's pick a good scheme for our duck service. The //! scheme should be unique and easy to understand. Normally we should //! use its formal name. //! @@ -128,12 +128,10 @@ //! vendors that provide s3-like RESTful APIs, and our s3 service is //! implemented to support all of them, not just AWS S3. //! -//! Obviously, we can use `duck` as scheme, let's add a new variant in [`Scheme`], and implement all required functions like `Scheme::from_str` and `Scheme::into_static`: +//! Obviously, we can use `duck` as scheme, let's add a new constant string: //! //! ```ignore -//! pub enum Scheme { -//! Duck, -//! } +//! pub const DUCK_SCHEME: &str = "duck"; //! ``` //! //! ## Builder @@ -273,7 +271,7 @@ //! //! fn info(&self) -> Arc<AccessorInfo> { //! let am = AccessorInfo::default(); -//! am.set_scheme("duck") +//! am.set_scheme(DUCK_SCHEME) //! .set_root(&self.root) //! .set_native_capability( //! Capability { @@ -301,6 +299,5 @@ //! [`Operation`]: crate::raw::Operation //! [`Capability`]: crate::Capability //! [`AccessorInfo`]: crate::raw::AccessorInfo -//! [`Scheme`]: crate::Scheme //! [`Builder`]: crate::Builder //! [`Configurator`]: crate::Configurator diff --git a/core/src/layers/async_backtrace.rs b/core/src/layers/async_backtrace.rs index 47a761185..e68c37817 100644 --- a/core/src/layers/async_backtrace.rs +++ b/core/src/layers/async_backtrace.rs @@ -32,7 +32,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? diff --git a/core/src/layers/await_tree.rs b/core/src/layers/await_tree.rs index 8d6f66a80..416d814ca 100644 --- a/core/src/layers/await_tree.rs +++ b/core/src/layers/await_tree.rs @@ -36,7 +36,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? diff --git a/core/src/layers/capability_check.rs b/core/src/layers/capability_check.rs index 1a8f534ee..e9455d323 100644 --- a/core/src/layers/capability_check.rs +++ b/core/src/layers/capability_check.rs @@ -45,7 +45,6 @@ use crate::raw::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// use opendal::layers::CapabilityCheckLayer; diff --git a/core/src/layers/chaos.rs b/core/src/layers/chaos.rs index 8a9424ec9..31ef3deec 100644 --- a/core/src/layers/chaos.rs +++ b/core/src/layers/chaos.rs @@ -48,7 +48,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? diff --git a/core/src/layers/concurrent_limit.rs b/core/src/layers/concurrent_limit.rs index 435149190..d51f4de45 100644 --- a/core/src/layers/concurrent_limit.rs +++ b/core/src/layers/concurrent_limit.rs @@ -50,7 +50,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? @@ -67,7 +66,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let limit = ConcurrentLimitLayer::new(1024); diff --git a/core/src/layers/error_context.rs b/core/src/layers/error_context.rs index 315068a98..305c62bce 100644 --- a/core/src/layers/error_context.rs +++ b/core/src/layers/error_context.rs @@ -28,7 +28,7 @@ use crate::*; /// /// This layer will add the following error context into all errors: /// -/// - `service`: The [`Scheme`] of underlying service. +/// - `service`: The scheme of underlying service. /// - `operation`: The [`Operation`] of this operation /// - `path`: The path of this operation /// diff --git a/core/src/layers/logging.rs b/core/src/layers/logging.rs index 70a0ae703..82c48f87f 100644 --- a/core/src/layers/logging.rs +++ b/core/src/layers/logging.rs @@ -45,7 +45,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? @@ -83,7 +82,6 @@ use crate::*; /// # use opendal::Error; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// #[derive(Debug, Clone)] /// struct MyLoggingInterceptor; diff --git a/core/src/layers/mime_guess.rs b/core/src/layers/mime_guess.rs index 2aaffdd24..aea79f6ce 100644 --- a/core/src/layers/mime_guess.rs +++ b/core/src/layers/mime_guess.rs @@ -49,7 +49,6 @@ use crate::raw::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? diff --git a/core/src/layers/retry.rs b/core/src/layers/retry.rs index cbb3b4c6b..59a63830f 100644 --- a/core/src/layers/retry.rs +++ b/core/src/layers/retry.rs @@ -75,7 +75,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? @@ -99,7 +98,6 @@ use crate::*; /// # use opendal::Error; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// struct MyRetryInterceptor; /// @@ -148,7 +146,6 @@ impl RetryLayer { /// use opendal::layers::RetryLayer; /// use opendal::services; /// use opendal::Operator; - /// use opendal::Scheme; /// /// let _ = Operator::new(services::Memory::default()) /// .expect("must init") diff --git a/core/src/layers/throttle.rs b/core/src/layers/throttle.rs index 1394aaaaf..9b8161c86 100644 --- a/core/src/layers/throttle.rs +++ b/core/src/layers/throttle.rs @@ -53,7 +53,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default()) diff --git a/core/src/layers/timeout.rs b/core/src/layers/timeout.rs index 54864aedd..8b6a78e33 100644 --- a/core/src/layers/timeout.rs +++ b/core/src/layers/timeout.rs @@ -84,7 +84,6 @@ use crate::*; /// # use opendal::services; /// # use opendal::Operator; /// # use opendal::Result; -/// # use opendal::Scheme; /// /// # fn main() -> Result<()> { /// let _ = Operator::new(services::Memory::default())? diff --git a/core/src/lib.rs b/core/src/lib.rs index cd53ad3f7..89177dbbb 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -183,7 +183,6 @@ mod tests { assert_eq!(360, size_of::<Entry>()); assert_eq!(336, size_of::<Metadata>()); assert_eq!(1, size_of::<EntryMode>()); - assert_eq!(24, size_of::<Scheme>()); } trait AssertSendSync: Send + Sync {} diff --git a/core/src/raw/tests/utils.rs b/core/src/raw/tests/utils.rs index 906be27a6..6cd2aeb39 100644 --- a/core/src/raw/tests/utils.rs +++ b/core/src/raw/tests/utils.rs @@ -17,7 +17,6 @@ use std::collections::HashMap; use std::env; -use std::str::FromStr; use std::sync::LazyLock; use crate::*; @@ -43,9 +42,8 @@ pub fn init_test_service() -> Result<Option<Operator>> { } else { return Ok(None); }; - let scheme = Scheme::from_str(&scheme).unwrap(); - let scheme_key = String::from(scheme).replace('-', "_"); + let scheme_key = scheme.replace('-', "_"); let prefix = format!("opendal_{scheme_key}_"); let mut cfg = env::vars() @@ -67,7 +65,7 @@ pub fn init_test_service() -> Result<Option<Operator>> { cfg.insert("root".to_string(), root); } - let op = Operator::via_iter(scheme, cfg).expect("must succeed"); + let op = Operator::via_iter(&scheme, cfg).expect("must succeed"); #[cfg(feature = "layers-chaos")] let op = { op.layer(layers::ChaosLayer::new(0.1)) }; diff --git a/core/src/types/context/read.rs b/core/src/types/context/read.rs index 4d79d83ca..f77f32557 100644 --- a/core/src/types/context/read.rs +++ b/core/src/types/context/read.rs @@ -172,14 +172,13 @@ impl ReadGenerator { #[cfg(test)] mod tests { - use bytes::Bytes; use super::*; #[tokio::test] async fn test_next_reader() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), @@ -205,7 +204,7 @@ mod tests { #[tokio::test] async fn test_next_reader_without_size() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), diff --git a/core/src/types/mod.rs b/core/src/types/mod.rs index 79f8daf36..fb168553f 100644 --- a/core/src/types/mod.rs +++ b/core/src/types/mod.rs @@ -62,9 +62,6 @@ pub use error::Error; pub use error::ErrorKind; pub use error::Result; -mod scheme; -pub use scheme::Scheme; - mod capability; pub use capability::Capability; diff --git a/core/src/types/operator/builder.rs b/core/src/types/operator/builder.rs index b417f3211..c312489fe 100644 --- a/core/src/types/operator/builder.rs +++ b/core/src/types/operator/builder.rs @@ -164,7 +164,8 @@ impl Operator { /// use std::collections::HashMap; /// /// use opendal::Operator; - /// use opendal::Scheme; + /// use opendal::services; + /// /// async fn test() -> Result<()> { /// let map = [ /// // Set the root for fs, all operations will happen under this root. @@ -174,135 +175,149 @@ impl Operator { /// ]; /// /// // Build an `Operator` to start operating the storage. - /// let op: Operator = Operator::via_iter(Scheme::Fs, map)?; + /// let op: Operator = Operator::via_iter(services::FS_SCHEME, map)?; /// /// Ok(()) /// } /// ``` #[allow(unused_variables, unreachable_code)] pub fn via_iter( - scheme: Scheme, + scheme: &str, iter: impl IntoIterator<Item = (String, String)>, ) -> Result<Operator> { let op = match scheme { #[cfg(feature = "services-aliyun-drive")] - Scheme::AliyunDrive => Self::from_iter::<services::AliyunDrive>(iter)?.finish(), + services::ALIYUN_DRIVE_SCHEME => { + Self::from_iter::<services::AliyunDrive>(iter)?.finish() + } #[cfg(feature = "services-alluxio")] - Scheme::Alluxio => Self::from_iter::<services::Alluxio>(iter)?.finish(), - #[cfg(feature = "services-cloudflare-kv")] - Scheme::CloudflareKv => Self::from_iter::<services::CloudflareKv>(iter)?.finish(), - #[cfg(feature = "services-compfs")] - Scheme::Compfs => Self::from_iter::<services::Compfs>(iter)?.finish(), - #[cfg(feature = "services-upyun")] - Scheme::Upyun => Self::from_iter::<services::Upyun>(iter)?.finish(), - #[cfg(feature = "services-koofr")] - Scheme::Koofr => Self::from_iter::<services::Koofr>(iter)?.finish(), - #[cfg(feature = "services-yandex-disk")] - Scheme::YandexDisk => Self::from_iter::<services::YandexDisk>(iter)?.finish(), - #[cfg(feature = "services-pcloud")] - Scheme::Pcloud => Self::from_iter::<services::Pcloud>(iter)?.finish(), + services::ALLUXIO_SCHEME => Self::from_iter::<services::Alluxio>(iter)?.finish(), #[cfg(feature = "services-azblob")] - Scheme::Azblob => Self::from_iter::<services::Azblob>(iter)?.finish(), + services::AZBLOB_SCHEME => Self::from_iter::<services::Azblob>(iter)?.finish(), #[cfg(feature = "services-azdls")] - Scheme::Azdls => Self::from_iter::<services::Azdls>(iter)?.finish(), + services::AZDLS_SCHEME => Self::from_iter::<services::Azdls>(iter)?.finish(), #[cfg(feature = "services-azfile")] - Scheme::Azfile => Self::from_iter::<services::Azfile>(iter)?.finish(), + services::AZFILE_SCHEME => Self::from_iter::<services::Azfile>(iter)?.finish(), #[cfg(feature = "services-b2")] - Scheme::B2 => Self::from_iter::<services::B2>(iter)?.finish(), + services::B2_SCHEME => Self::from_iter::<services::B2>(iter)?.finish(), #[cfg(feature = "services-cacache")] - Scheme::Cacache => Self::from_iter::<services::Cacache>(iter)?.finish(), + 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")] - Scheme::Cos => Self::from_iter::<services::Cos>(iter)?.finish(), + services::COS_SCHEME => Self::from_iter::<services::Cos>(iter)?.finish(), #[cfg(feature = "services-d1")] - Scheme::D1 => Self::from_iter::<services::D1>(iter)?.finish(), + services::D1_SCHEME => Self::from_iter::<services::D1>(iter)?.finish(), #[cfg(feature = "services-dashmap")] - Scheme::Dashmap => Self::from_iter::<services::Dashmap>(iter)?.finish(), + 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")] - Scheme::Dropbox => Self::from_iter::<services::Dropbox>(iter)?.finish(), + services::DROPBOX_SCHEME => Self::from_iter::<services::Dropbox>(iter)?.finish(), #[cfg(feature = "services-etcd")] - Scheme::Etcd => Self::from_iter::<services::Etcd>(iter)?.finish(), + services::ETCD_SCHEME => Self::from_iter::<services::Etcd>(iter)?.finish(), #[cfg(feature = "services-foundationdb")] - Scheme::Foundationdb => Self::from_iter::<services::Foundationdb>(iter)?.finish(), + services::FOUNDATIONDB_SCHEME => { + Self::from_iter::<services::Foundationdb>(iter)?.finish() + } #[cfg(feature = "services-fs")] - Scheme::Fs => Self::from_iter::<services::Fs>(iter)?.finish(), + services::FS_SCHEME => Self::from_iter::<services::Fs>(iter)?.finish(), #[cfg(feature = "services-ftp")] - Scheme::Ftp => Self::from_iter::<services::Ftp>(iter)?.finish(), + services::FTP_SCHEME => Self::from_iter::<services::Ftp>(iter)?.finish(), #[cfg(feature = "services-gcs")] - Scheme::Gcs => Self::from_iter::<services::Gcs>(iter)?.finish(), + 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")] - Scheme::Ghac => Self::from_iter::<services::Ghac>(iter)?.finish(), - #[cfg(feature = "services-gridfs")] - Scheme::Gridfs => Self::from_iter::<services::Gridfs>(iter)?.finish(), + services::GHAC_SCHEME => Self::from_iter::<services::Ghac>(iter)?.finish(), #[cfg(feature = "services-github")] - Scheme::Github => Self::from_iter::<services::Github>(iter)?.finish(), + 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")] - Scheme::Hdfs => Self::from_iter::<services::Hdfs>(iter)?.finish(), + 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")] - Scheme::Http => Self::from_iter::<services::Http>(iter)?.finish(), + services::HTTP_SCHEME => Self::from_iter::<services::Http>(iter)?.finish(), #[cfg(feature = "services-huggingface")] - Scheme::Huggingface => Self::from_iter::<services::Huggingface>(iter)?.finish(), + services::HUGGINGFACE_SCHEME => { + Self::from_iter::<services::Huggingface>(iter)?.finish() + } #[cfg(feature = "services-ipfs")] - Scheme::Ipfs => Self::from_iter::<services::Ipfs>(iter)?.finish(), + services::IPFS_SCHEME => Self::from_iter::<services::Ipfs>(iter)?.finish(), #[cfg(feature = "services-ipmfs")] - Scheme::Ipmfs => Self::from_iter::<services::Ipmfs>(iter)?.finish(), + 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")] - Scheme::Memcached => Self::from_iter::<services::Memcached>(iter)?.finish(), + services::MEMCACHED_SCHEME => Self::from_iter::<services::Memcached>(iter)?.finish(), #[cfg(feature = "services-memory")] - Scheme::Memory => Self::from_iter::<services::Memory>(iter)?.finish(), + services::MEMORY_SCHEME => Self::from_iter::<services::Memory>(iter)?.finish(), #[cfg(feature = "services-mini-moka")] - Scheme::MiniMoka => Self::from_iter::<services::MiniMoka>(iter)?.finish(), + services::MINI_MOKA_SCHEME => Self::from_iter::<services::MiniMoka>(iter)?.finish(), #[cfg(feature = "services-moka")] - Scheme::Moka => Self::from_iter::<services::Moka>(iter)?.finish(), + 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")] - Scheme::Monoiofs => Self::from_iter::<services::Monoiofs>(iter)?.finish(), + services::MONOIOFS_SCHEME => Self::from_iter::<services::Monoiofs>(iter)?.finish(), #[cfg(feature = "services-mysql")] - Scheme::Mysql => Self::from_iter::<services::Mysql>(iter)?.finish(), + services::MYSQL_SCHEME => Self::from_iter::<services::Mysql>(iter)?.finish(), #[cfg(feature = "services-obs")] - Scheme::Obs => Self::from_iter::<services::Obs>(iter)?.finish(), + services::OBS_SCHEME => Self::from_iter::<services::Obs>(iter)?.finish(), #[cfg(feature = "services-onedrive")] - Scheme::Onedrive => Self::from_iter::<services::Onedrive>(iter)?.finish(), - #[cfg(feature = "services-postgresql")] - Scheme::Postgresql => Self::from_iter::<services::Postgresql>(iter)?.finish(), - #[cfg(feature = "services-gdrive")] - Scheme::Gdrive => Self::from_iter::<services::Gdrive>(iter)?.finish(), + services::ONEDRIVE_SCHEME => Self::from_iter::<services::Onedrive>(iter)?.finish(), #[cfg(feature = "services-oss")] - Scheme::Oss => Self::from_iter::<services::Oss>(iter)?.finish(), + 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")] - Scheme::Persy => Self::from_iter::<services::Persy>(iter)?.finish(), + 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")] - Scheme::Redis => Self::from_iter::<services::Redis>(iter)?.finish(), + services::REDIS_SCHEME => Self::from_iter::<services::Redis>(iter)?.finish(), #[cfg(feature = "services-rocksdb")] - Scheme::Rocksdb => Self::from_iter::<services::Rocksdb>(iter)?.finish(), + services::ROCKSDB_SCHEME => Self::from_iter::<services::Rocksdb>(iter)?.finish(), #[cfg(feature = "services-s3")] - Scheme::S3 => Self::from_iter::<services::S3>(iter)?.finish(), + services::S3_SCHEME => Self::from_iter::<services::S3>(iter)?.finish(), #[cfg(feature = "services-seafile")] - Scheme::Seafile => Self::from_iter::<services::Seafile>(iter)?.finish(), + services::SEAFILE_SCHEME => Self::from_iter::<services::Seafile>(iter)?.finish(), #[cfg(feature = "services-sftp")] - Scheme::Sftp => Self::from_iter::<services::Sftp>(iter)?.finish(), + services::SFTP_SCHEME => Self::from_iter::<services::Sftp>(iter)?.finish(), #[cfg(feature = "services-sled")] - Scheme::Sled => Self::from_iter::<services::Sled>(iter)?.finish(), + services::SLED_SCHEME => Self::from_iter::<services::Sled>(iter)?.finish(), #[cfg(feature = "services-sqlite")] - Scheme::Sqlite => Self::from_iter::<services::Sqlite>(iter)?.finish(), + 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")] - Scheme::Swift => Self::from_iter::<services::Swift>(iter)?.finish(), + services::SWIFT_SCHEME => Self::from_iter::<services::Swift>(iter)?.finish(), #[cfg(feature = "services-tikv")] - Scheme::Tikv => Self::from_iter::<services::Tikv>(iter)?.finish(), + 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")] - Scheme::VercelArtifacts => Self::from_iter::<services::VercelArtifacts>(iter)?.finish(), + services::VERCEL_ARTIFACTS_SCHEME => { + Self::from_iter::<services::VercelArtifacts>(iter)?.finish() + } #[cfg(feature = "services-vercel-blob")] - Scheme::VercelBlob => Self::from_iter::<services::VercelBlob>(iter)?.finish(), + services::VERCEL_BLOB_SCHEME => Self::from_iter::<services::VercelBlob>(iter)?.finish(), #[cfg(feature = "services-webdav")] - Scheme::Webdav => Self::from_iter::<services::Webdav>(iter)?.finish(), + services::WEBDAV_SCHEME => Self::from_iter::<services::Webdav>(iter)?.finish(), #[cfg(feature = "services-webhdfs")] - Scheme::Webhdfs => Self::from_iter::<services::Webhdfs>(iter)?.finish(), - #[cfg(feature = "services-redb")] - Scheme::Redb => Self::from_iter::<services::Redb>(iter)?.finish(), - #[cfg(feature = "services-mongodb")] - Scheme::Mongodb => Self::from_iter::<services::Mongodb>(iter)?.finish(), - #[cfg(feature = "services-hdfs-native")] - Scheme::HdfsNative => Self::from_iter::<services::HdfsNative>(iter)?.finish(), - #[cfg(feature = "services-lakefs")] - Scheme::Lakefs => Self::from_iter::<services::Lakefs>(iter)?.finish(), + 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, @@ -364,18 +379,17 @@ impl Operator { /// use std::collections::HashMap; /// /// use opendal::Operator; - /// use opendal::Scheme; /// async fn test() -> Result<()> { /// let map = HashMap::new(); /// /// // Build an `Operator` to start operating the storage. - /// let op: Operator = Operator::via_map(Scheme::Memory, map)?; + /// let op: Operator = Operator::via_map(opendal::services::MEMORY_SCHEME, map)?; /// /// Ok(()) /// } /// ``` #[deprecated = "use via_iter instead"] - pub fn via_map(scheme: Scheme, map: HashMap<String, String>) -> Result<Operator> { + pub fn via_map(scheme: &str, map: HashMap<String, String>) -> Result<Operator> { Self::via_iter(scheme, map) } @@ -443,7 +457,6 @@ impl Operator { /// use opendal::Builder; /// use opendal::Operator; /// use opendal::Result; -/// use opendal::Scheme; /// /// fn init_service<B: Builder>(cfg: HashMap<String, String>) -> Result<Operator> { /// let op = Operator::from_map::<B>(cfg)? @@ -454,9 +467,9 @@ impl Operator { /// Ok(op) /// } /// -/// async fn init(scheme: Scheme, cfg: HashMap<String, String>) -> Result<()> { +/// async fn init(scheme: &str, cfg: HashMap<String, String>) -> Result<()> { /// let _ = match scheme { -/// Scheme::Memory => init_service::<services::Memory>(cfg)?, +/// services::MEMORY_SCHEME => init_service::<services::Memory>(cfg)?, /// _ => todo!(), /// }; /// diff --git a/core/src/types/operator/info.rs b/core/src/types/operator/info.rs index 2e483f450..d2af58793 100644 --- a/core/src/types/operator/info.rs +++ b/core/src/types/operator/info.rs @@ -15,7 +15,6 @@ // specific language governing permissions and limitations // under the License. -use std::str::FromStr; use std::sync::Arc; use crate::raw::*; @@ -30,10 +29,9 @@ impl OperatorInfo { OperatorInfo(acc) } - /// [`Scheme`] of operator. - pub fn scheme(&self) -> Scheme { - let scheme_str = self.0.scheme(); - Scheme::from_str(scheme_str).unwrap_or(Scheme::Custom(scheme_str)) + /// Scheme of operator. + pub fn scheme(&self) -> &'static str { + self.0.scheme() } /// 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 f27306f3a..5f255ab52 100644 --- a/core/src/types/operator/operator.rs +++ b/core/src/types/operator/operator.rs @@ -599,7 +599,6 @@ impl Operator { /// # use opendal::Result; /// # use opendal::Operator; /// # use futures::TryStreamExt; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op.reader("path/to/file").await?; /// // Read the first 10 bytes of the file @@ -624,7 +623,6 @@ impl Operator { /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op.reader_with("path/to/file").version("version_id").await?; /// // Read the first 10 bytes of the file diff --git a/core/src/types/operator/operator_futures.rs b/core/src/types/operator/operator_futures.rs index eeb594972..1a1276bb1 100644 --- a/core/src/types/operator/operator_futures.rs +++ b/core/src/types/operator/operator_futures.rs @@ -282,7 +282,6 @@ impl<F: Future<Output = Result<Buffer>>> FutureRead<F> { /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op.read_with("path/to/file").concurrent(8).await?; /// # Ok(()) @@ -300,7 +299,6 @@ impl<F: Future<Output = Result<Buffer>>> FutureRead<F> { /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op.read_with("path/to/file").chunk(4 * 1024 * 1024).await?; /// # Ok(()) @@ -461,7 +459,6 @@ impl<F: Future<Output = Result<Reader>>> FutureReader<F> { /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op.reader_with("path/to/file").concurrent(8).await?; /// # Ok(()) @@ -479,7 +476,6 @@ impl<F: Future<Output = Result<Reader>>> FutureReader<F> { /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op /// .reader_with("path/to/file") @@ -510,7 +506,6 @@ impl<F: Future<Output = Result<Reader>>> FutureReader<F> { /// ``` /// # use opendal::Result; /// # use opendal::Operator; - /// # use opendal::Scheme; /// # async fn test(op: Operator) -> Result<()> { /// let r = op /// .reader_with("path/to/file") diff --git a/core/src/types/read/buffer_stream.rs b/core/src/types/read/buffer_stream.rs index 9c5ff4fdc..811fc08df 100644 --- a/core/src/types/read/buffer_stream.rs +++ b/core/src/types/read/buffer_stream.rs @@ -228,7 +228,7 @@ mod tests { #[tokio::test] async fn test_trait() -> Result<()> { - let acc = Operator::via_iter(Scheme::Memory, [])?.into_inner(); + let acc = Operator::via_iter(services::MEMORY_SCHEME, [])?.into_inner(); let ctx = Arc::new(ReadContext::new( acc, "test".to_string(), @@ -244,7 +244,7 @@ mod tests { #[tokio::test] async fn test_buffer_stream() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), diff --git a/core/src/types/read/futures_async_reader.rs b/core/src/types/read/futures_async_reader.rs index 86b88228d..de5aa3b20 100644 --- a/core/src/types/read/futures_async_reader.rs +++ b/core/src/types/read/futures_async_reader.rs @@ -183,7 +183,7 @@ mod tests { #[tokio::test] async fn test_trait() -> Result<()> { - let acc = Operator::via_iter(Scheme::Memory, [])?.into_inner(); + let acc = Operator::via_iter(services::MEMORY_SCHEME, [])?.into_inner(); let ctx = Arc::new(ReadContext::new( acc, "test".to_string(), @@ -199,7 +199,7 @@ mod tests { #[tokio::test] async fn test_futures_async_read() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), @@ -230,7 +230,7 @@ mod tests { #[tokio::test] async fn test_futures_async_read_with_concurrent() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), @@ -261,7 +261,7 @@ mod tests { #[tokio::test] async fn test_futures_async_buf_read() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), diff --git a/core/src/types/read/futures_bytes_stream.rs b/core/src/types/read/futures_bytes_stream.rs index bc55cc7c5..1a4e7ac11 100644 --- a/core/src/types/read/futures_bytes_stream.rs +++ b/core/src/types/read/futures_bytes_stream.rs @@ -89,7 +89,7 @@ mod tests { #[tokio::test] async fn test_trait() -> Result<()> { - let acc = Operator::via_iter(Scheme::Memory, [])?.into_inner(); + let acc = Operator::via_iter(services::MEMORY_SCHEME, [])?.into_inner(); let ctx = Arc::new(ReadContext::new( acc, "test".to_string(), @@ -105,7 +105,7 @@ mod tests { #[tokio::test] async fn test_futures_bytes_stream() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), @@ -130,7 +130,7 @@ mod tests { #[tokio::test] async fn test_futures_bytes_stream_with_concurrent() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), diff --git a/core/src/types/read/reader.rs b/core/src/types/read/reader.rs index 6908a900b..230306aa4 100644 --- a/core/src/types/read/reader.rs +++ b/core/src/types/read/reader.rs @@ -440,7 +440,7 @@ mod tests { #[tokio::test] async fn test_trait() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; op.write( "test", Buffer::from(vec![Bytes::from("Hello"), Bytes::from("World")]), @@ -473,7 +473,7 @@ mod tests { #[tokio::test] async fn test_reader_read() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; let path = "test_file"; let content = gen_random_bytes(); @@ -490,7 +490,7 @@ mod tests { #[tokio::test] async fn test_reader_read_with_chunk() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; let path = "test_file"; let content = gen_random_bytes(); @@ -507,7 +507,7 @@ mod tests { #[tokio::test] async fn test_reader_read_with_concurrent() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; let path = "test_file"; let content = gen_random_bytes(); @@ -529,7 +529,7 @@ mod tests { #[tokio::test] async fn test_reader_read_into() -> Result<()> { - let op = Operator::via_iter(Scheme::Memory, [])?; + let op = Operator::via_iter(services::MEMORY_SCHEME, [])?; let path = "test_file"; let content = gen_random_bytes(); diff --git a/core/src/types/scheme.rs b/core/src/types/scheme.rs deleted file mode 100644 index 2b12a566a..000000000 --- a/core/src/types/scheme.rs +++ /dev/null @@ -1,461 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -use std::collections::HashSet; -use std::fmt::Display; -use std::fmt::Formatter; -use std::str::FromStr; - -use crate::Error; - -/// Services that OpenDAL supports -/// -/// # Notes -/// -/// - Scheme is `non_exhaustive`, new variant COULD be added at any time. -/// - New variant SHOULD be added in alphabet orders, -/// - Users MUST NOT relay on its order. -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)] -#[non_exhaustive] -pub enum Scheme { - /// [aliyun-drive][crate::services::AliyunDrive]: Aliyun Drive services. - AliyunDrive, - /// [azblob][crate::services::Azblob]: Azure Storage Blob services. - Azblob, - /// [Azdls][crate::services::Azdls]: Azure Data Lake Storage Gen2. - Azdls, - /// [B2][crate::services::B2]: Backblaze B2 Services. - B2, - /// [Compfs][crate::services::Compfs]: Compio fs Services. - Compfs, - /// [Seafile][crate::services::Seafile]: Seafile Services. - Seafile, - /// [Upyun][crate::services::Upyun]: Upyun Services. - Upyun, - /// [VercelBlob][crate::services::VercelBlob]: VercelBlob Services. - VercelBlob, - /// [YandexDisk][crate::services::YandexDisk]: YandexDisk Services. - YandexDisk, - /// [Pcloud][crate::services::Pcloud]: Pcloud Services. - Pcloud, - /// [Koofr][crate::services::Koofr]: Koofr Services. - Koofr, - /// [cacache][crate::services::Cacache]: cacache backend support. - Cacache, - /// [cloudflare-kv][crate::services::CloudflareKv]: Cloudflare KV services. - CloudflareKv, - /// [cos][crate::services::Cos]: Tencent Cloud Object Storage services. - Cos, - /// [d1][crate::services::D1]: D1 services - D1, - /// [dashmap][crate::services::Dashmap]: dashmap backend support. - Dashmap, - /// [etcd][crate::services::Etcd]: Etcd Services - Etcd, - /// [foundationdb][crate::services::Foundationdb]: Foundationdb services. - Foundationdb, - /// [dbfs][crate::services::Dbfs]: DBFS backend support. - Dbfs, - /// [fs][crate::services::Fs]: POSIX-like file system. - Fs, - /// [ftp][crate::services::Ftp]: FTP backend. - Ftp, - /// [gcs][crate::services::Gcs]: Google Cloud Storage backend. - Gcs, - /// [ghac][crate::services::Ghac]: GitHub Action Cache services. - Ghac, - /// [hdfs][crate::services::Hdfs]: Hadoop Distributed File System. - Hdfs, - /// [http][crate::services::Http]: HTTP backend. - Http, - /// [huggingface][crate::services::Huggingface]: Huggingface services. - Huggingface, - /// [alluxio][crate::services::Alluxio]: Alluxio services. - Alluxio, - - /// [ipmfs][crate::services::Ipfs]: IPFS HTTP Gateway - Ipfs, - /// [ipmfs][crate::services::Ipmfs]: IPFS mutable file system - Ipmfs, - /// [memcached][crate::services::Memcached]: Memcached service support. - Memcached, - /// [memory][crate::services::Memory]: In memory backend support. - #[default] - Memory, - /// [mini-moka][crate::services::MiniMoka]: Mini Moka backend support. - MiniMoka, - /// [moka][crate::services::Moka]: moka backend support. - Moka, - /// [monoiofs][crate::services::Monoiofs]: monoio fs services. - Monoiofs, - /// [obs][crate::services::Obs]: Huawei Cloud OBS services. - Obs, - /// [onedrive][crate::services::Onedrive]: Microsoft OneDrive services. - Onedrive, - /// [gdrive][crate::services::Gdrive]: GoogleDrive services. - Gdrive, - /// [dropbox][crate::services::Dropbox]: Dropbox services. - Dropbox, - /// [oss][crate::services::Oss]: Aliyun Object Storage Services - Oss, - /// [persy][crate::services::Persy]: persy backend support. - Persy, - /// [redis][crate::services::Redis]: Redis services - Redis, - /// [postgresql][crate::services::Postgresql]: Postgresql services - Postgresql, - /// [mysql][crate::services::Mysql]: Mysql services - Mysql, - /// [sqlite][crate::services::Sqlite]: Sqlite services - Sqlite, - /// [rocksdb][crate::services::Rocksdb]: RocksDB services - Rocksdb, - /// [s3][crate::services::S3]: AWS S3 alike services. - S3, - /// [sftp][crate::services::Sftp]: SFTP services - Sftp, - /// [sled][crate::services::Sled]: Sled services - Sled, - /// [swift][crate::services::Swift]: Swift backend support. - Swift, - /// [Vercel Artifacts][crate::services::VercelArtifacts]: Vercel Artifacts service, as known as Vercel Remote Caching. - VercelArtifacts, - /// [webdav][crate::services::Webdav]: WebDAV support. - Webdav, - /// [webhdfs][crate::services::Webhdfs]: WebHDFS RESTful API Services - Webhdfs, - /// [redb][crate::services::Redb]: Redb Services - Redb, - /// [tikv][crate::services::Tikv]: Tikv Services - Tikv, - /// [azfile][crate::services::Azfile]: Azfile Services - Azfile, - /// [mongodb](crate::services::Mongodb): MongoDB Services - Mongodb, - /// [gridfs](crate::services::Gridfs): MongoDB Gridfs Services - Gridfs, - /// [Github Contents][crate::services::Github]: Github contents support. - Github, - /// [Native HDFS](crate::services::HdfsNative): Hdfs Native service, using rust hdfs-native client for hdfs - HdfsNative, - /// [surrealdb](crate::services::Surrealdb): Surrealdb Services - Surrealdb, - /// [lakefs](crate::services::Lakefs): LakeFS Services - Lakefs, - /// Custom that allow users to implement services outside OpenDAL. - /// - /// # NOTE - /// - /// - Custom must not overwrite any existing services name. - /// - Custom must be in lower case. - Custom(&'static str), -} - -impl Scheme { - /// Convert self into static str. - pub fn into_static(self) -> &'static str { - self.into() - } - - /// Get all enabled schemes. - /// - /// OpenDAL could be compiled with different features, which will enable different schemes. - /// This function returns all enabled schemes so users can make decisions based on it. - /// - /// # Examples - /// - /// ```rust,no_run - /// use opendal::Scheme; - /// - /// let enabled_schemes = Scheme::enabled(); - /// if !enabled_schemes.contains(&Scheme::Memory) { - /// panic!("s3 support is not enabled") - /// } - /// ``` - pub fn enabled() -> HashSet<Scheme> { - HashSet::from([ - #[cfg(feature = "services-aliyun-drive")] - Scheme::AliyunDrive, - #[cfg(feature = "services-alluxio")] - Scheme::Alluxio, - #[cfg(feature = "services-azblob")] - Scheme::Azblob, - #[cfg(feature = "services-azdls")] - Scheme::Azdls, - #[cfg(feature = "services-azfile")] - Scheme::Azfile, - #[cfg(feature = "services-b2")] - Scheme::B2, - #[cfg(feature = "services-cacache")] - Scheme::Cacache, - #[cfg(feature = "services-cos")] - Scheme::Cos, - #[cfg(feature = "services-compfs")] - Scheme::Compfs, - #[cfg(feature = "services-dashmap")] - Scheme::Dashmap, - #[cfg(feature = "services-dropbox")] - Scheme::Dropbox, - #[cfg(feature = "services-etcd")] - Scheme::Etcd, - #[cfg(feature = "services-foundationdb")] - Scheme::Foundationdb, - #[cfg(feature = "services-fs")] - Scheme::Fs, - #[cfg(feature = "services-ftp")] - Scheme::Ftp, - #[cfg(feature = "services-gcs")] - Scheme::Gcs, - #[cfg(feature = "services-ghac")] - Scheme::Ghac, - #[cfg(feature = "services-hdfs")] - Scheme::Hdfs, - #[cfg(feature = "services-http")] - Scheme::Http, - #[cfg(feature = "services-huggingface")] - Scheme::Huggingface, - #[cfg(feature = "services-ipfs")] - Scheme::Ipfs, - #[cfg(feature = "services-ipmfs")] - Scheme::Ipmfs, - #[cfg(feature = "services-memcached")] - Scheme::Memcached, - #[cfg(feature = "services-memory")] - Scheme::Memory, - #[cfg(feature = "services-mini-moka")] - Scheme::MiniMoka, - #[cfg(feature = "services-moka")] - Scheme::Moka, - #[cfg(feature = "services-monoiofs")] - Scheme::Monoiofs, - #[cfg(feature = "services-mysql")] - Scheme::Mysql, - #[cfg(feature = "services-obs")] - Scheme::Obs, - #[cfg(feature = "services-onedrive")] - Scheme::Onedrive, - #[cfg(feature = "services-postgresql")] - Scheme::Postgresql, - #[cfg(feature = "services-gdrive")] - Scheme::Gdrive, - #[cfg(feature = "services-oss")] - Scheme::Oss, - #[cfg(feature = "services-persy")] - Scheme::Persy, - #[cfg(feature = "services-redis")] - Scheme::Redis, - #[cfg(feature = "services-rocksdb")] - Scheme::Rocksdb, - #[cfg(feature = "services-s3")] - Scheme::S3, - #[cfg(feature = "services-seafile")] - Scheme::Seafile, - #[cfg(feature = "services-upyun")] - Scheme::Upyun, - #[cfg(feature = "services-yandex-disk")] - Scheme::YandexDisk, - #[cfg(feature = "services-pcloud")] - Scheme::Pcloud, - #[cfg(feature = "services-sftp")] - Scheme::Sftp, - #[cfg(feature = "services-sled")] - Scheme::Sled, - #[cfg(feature = "services-sqlite")] - Scheme::Sqlite, - #[cfg(feature = "services-swift")] - Scheme::Swift, - #[cfg(feature = "services-tikv")] - Scheme::Tikv, - #[cfg(feature = "services-vercel-artifacts")] - Scheme::VercelArtifacts, - #[cfg(feature = "services-vercel-blob")] - Scheme::VercelBlob, - #[cfg(feature = "services-webdav")] - Scheme::Webdav, - #[cfg(feature = "services-webhdfs")] - Scheme::Webhdfs, - #[cfg(feature = "services-redb")] - Scheme::Redb, - #[cfg(feature = "services-mongodb")] - Scheme::Mongodb, - #[cfg(feature = "services-hdfs-native")] - Scheme::HdfsNative, - #[cfg(feature = "services-surrealdb")] - Scheme::Surrealdb, - #[cfg(feature = "services-lakefs")] - Scheme::Lakefs, - #[cfg(feature = "services-cloudflare-kv")] - Scheme::CloudflareKv, - ]) - } -} - -impl Display for Scheme { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{}", self.into_static()) - } -} - -impl FromStr for Scheme { - type Err = Error; - - fn from_str(s: &str) -> Result<Self, Self::Err> { - let s = s.to_lowercase(); - match s.as_str() { - "aliyun-drive" | "aliyun_drive" => Ok(Scheme::AliyunDrive), - "azblob" => Ok(Scheme::Azblob), - "alluxio" => Ok(Scheme::Alluxio), - // Notes: - // - // OpenDAL used to call `azdls` as `azdfs`, we keep it for backward compatibility. - // And abfs is widely used in hadoop ecosystem, keep it for easy to use. - "azdls" | "azdfs" | "abfs" => Ok(Scheme::Azdls), - "b2" => Ok(Scheme::B2), - "cacache" => Ok(Scheme::Cacache), - "compfs" => Ok(Scheme::Compfs), - "cloudflare-kv" | "cloudflare_kv" => Ok(Scheme::CloudflareKv), - "cos" => Ok(Scheme::Cos), - "d1" => Ok(Scheme::D1), - "dashmap" => Ok(Scheme::Dashmap), - "dropbox" => Ok(Scheme::Dropbox), - "etcd" => Ok(Scheme::Etcd), - "dbfs" => Ok(Scheme::Dbfs), - "fs" => Ok(Scheme::Fs), - "gcs" => Ok(Scheme::Gcs), - "gdrive" => Ok(Scheme::Gdrive), - "ghac" => Ok(Scheme::Ghac), - "gridfs" => Ok(Scheme::Gridfs), - "github" => Ok(Scheme::Github), - "hdfs" => Ok(Scheme::Hdfs), - "http" | "https" => Ok(Scheme::Http), - "huggingface" | "hf" => Ok(Scheme::Huggingface), - "ftp" | "ftps" => Ok(Scheme::Ftp), - "ipfs" | "ipns" => Ok(Scheme::Ipfs), - "ipmfs" => Ok(Scheme::Ipmfs), - "koofr" => Ok(Scheme::Koofr), - "memcached" => Ok(Scheme::Memcached), - "memory" => Ok(Scheme::Memory), - "mysql" => Ok(Scheme::Mysql), - "sqlite" => Ok(Scheme::Sqlite), - "mini-moka" | "mini_moka" => Ok(Scheme::MiniMoka), - "moka" => Ok(Scheme::Moka), - "monoiofs" => Ok(Scheme::Monoiofs), - "obs" => Ok(Scheme::Obs), - "onedrive" => Ok(Scheme::Onedrive), - "persy" => Ok(Scheme::Persy), - "postgresql" => Ok(Scheme::Postgresql), - "redb" => Ok(Scheme::Redb), - "redis" => Ok(Scheme::Redis), - "rocksdb" => Ok(Scheme::Rocksdb), - "s3" => Ok(Scheme::S3), - "seafile" => Ok(Scheme::Seafile), - "upyun" => Ok(Scheme::Upyun), - "yandex-disk" | "yandex_disk" => Ok(Scheme::YandexDisk), - "pcloud" => Ok(Scheme::Pcloud), - "sftp" => Ok(Scheme::Sftp), - "sled" => Ok(Scheme::Sled), - "swift" => Ok(Scheme::Swift), - "oss" => Ok(Scheme::Oss), - "vercel-artifacts" | "vercel_artifacts" => Ok(Scheme::VercelArtifacts), - "vercel-blob" | "vercel_blob" => Ok(Scheme::VercelBlob), - "webdav" => Ok(Scheme::Webdav), - "webhdfs" => Ok(Scheme::Webhdfs), - "tikv" => Ok(Scheme::Tikv), - "azfile" => Ok(Scheme::Azfile), - "mongodb" => Ok(Scheme::Mongodb), - "hdfs-native" | "hdfs_native" => Ok(Scheme::HdfsNative), - "surrealdb" => Ok(Scheme::Surrealdb), - "lakefs" => Ok(Scheme::Lakefs), - _ => Ok(Scheme::Custom(Box::leak(s.into_boxed_str()))), - } - } -} - -impl From<Scheme> for &'static str { - fn from(v: Scheme) -> Self { - match v { - Scheme::AliyunDrive => "aliyun-drive", - Scheme::Azblob => "azblob", - Scheme::Azdls => "azdls", - Scheme::B2 => "b2", - Scheme::Cacache => "cacache", - Scheme::CloudflareKv => "cloudflare-kv", - Scheme::Cos => "cos", - Scheme::Compfs => "compfs", - Scheme::D1 => "d1", - Scheme::Dashmap => "dashmap", - Scheme::Etcd => "etcd", - Scheme::Dbfs => "dbfs", - Scheme::Fs => "fs", - Scheme::Gcs => "gcs", - Scheme::Ghac => "ghac", - Scheme::Gridfs => "gridfs", - Scheme::Hdfs => "hdfs", - Scheme::Http => "http", - Scheme::Huggingface => "huggingface", - Scheme::Foundationdb => "foundationdb", - Scheme::Ftp => "ftp", - Scheme::Ipfs => "ipfs", - Scheme::Ipmfs => "ipmfs", - Scheme::Koofr => "koofr", - Scheme::Memcached => "memcached", - Scheme::Memory => "memory", - Scheme::MiniMoka => "mini-moka", - Scheme::Moka => "moka", - Scheme::Monoiofs => "monoiofs", - Scheme::Obs => "obs", - Scheme::Onedrive => "onedrive", - Scheme::Persy => "persy", - Scheme::Postgresql => "postgresql", - Scheme::Mysql => "mysql", - Scheme::Gdrive => "gdrive", - Scheme::Github => "github", - Scheme::Dropbox => "dropbox", - Scheme::Redis => "redis", - Scheme::Rocksdb => "rocksdb", - Scheme::S3 => "s3", - Scheme::Seafile => "seafile", - Scheme::Sftp => "sftp", - Scheme::Sled => "sled", - Scheme::Swift => "swift", - Scheme::VercelArtifacts => "vercel-artifacts", - Scheme::VercelBlob => "vercel-blob", - Scheme::Oss => "oss", - Scheme::Webdav => "webdav", - Scheme::Webhdfs => "webhdfs", - Scheme::Redb => "redb", - Scheme::Tikv => "tikv", - Scheme::Azfile => "azfile", - Scheme::Sqlite => "sqlite", - Scheme::Mongodb => "mongodb", - Scheme::Alluxio => "alluxio", - Scheme::Upyun => "upyun", - Scheme::YandexDisk => "yandex-disk", - Scheme::Pcloud => "pcloud", - Scheme::HdfsNative => "hdfs-native", - Scheme::Surrealdb => "surrealdb", - Scheme::Lakefs => "lakefs", - Scheme::Custom(v) => v, - } - } -} - -impl From<Scheme> for String { - fn from(v: Scheme) -> Self { - v.into_static().to_string() - } -} diff --git a/core/src/types/write/buffer_sink.rs b/core/src/types/write/buffer_sink.rs index 7c5ba4205..4faf550c5 100644 --- a/core/src/types/write/buffer_sink.rs +++ b/core/src/types/write/buffer_sink.rs @@ -170,7 +170,7 @@ mod tests { #[tokio::test] async fn test_trait() { - let op = Operator::via_iter(Scheme::Memory, []).unwrap(); + let op = Operator::via_iter(services::MEMORY_SCHEME, []).unwrap(); let acc = op.into_inner(); let ctx = Arc::new(WriteContext::new( diff --git a/core/src/types/write/futures_async_writer.rs b/core/src/types/write/futures_async_writer.rs index 28dd89dff..752a74d63 100644 --- a/core/src/types/write/futures_async_writer.rs +++ b/core/src/types/write/futures_async_writer.rs @@ -118,7 +118,7 @@ mod tests { #[tokio::test] async fn test_trait() { - let op = Operator::via_iter(Scheme::Memory, []).unwrap(); + let op = Operator::via_iter(services::MEMORY_SCHEME, []).unwrap(); let acc = op.into_inner(); let ctx = Arc::new(WriteContext::new( diff --git a/core/src/types/write/futures_bytes_sink.rs b/core/src/types/write/futures_bytes_sink.rs index de5563992..1530728c4 100644 --- a/core/src/types/write/futures_bytes_sink.rs +++ b/core/src/types/write/futures_bytes_sink.rs @@ -85,7 +85,7 @@ mod tests { #[tokio::test] async fn test_trait() { - let op = Operator::via_iter(Scheme::Memory, []).unwrap(); + let op = Operator::via_iter(services::MEMORY_SCHEME, []).unwrap(); let acc = op.into_inner(); let ctx = Arc::new(WriteContext::new( diff --git a/core/tests/behavior/async_copy.rs b/core/tests/behavior/async_copy.rs index bc73ddccf..58274d43b 100644 --- a/core/tests/behavior/async_copy.rs +++ b/core/tests/behavior/async_copy.rs @@ -76,7 +76,7 @@ pub async fn test_copy_file_with_ascii_name(op: Operator) -> Result<()> { /// Copy a file with non ascii name and test contents. pub async fn test_copy_file_with_non_ascii_name(op: Operator) -> Result<()> { // Koofr does not support non-ascii name.(https://github.com/apache/opendal/issues/4051) - if op.info().scheme() == Scheme::Koofr { + if op.info().scheme() == services::KOOFR_SCHEME { return Ok(()); } diff --git a/core/tests/behavior/async_delete.rs b/core/tests/behavior/async_delete.rs index 7b517367d..9d897588e 100644 --- a/core/tests/behavior/async_delete.rs +++ b/core/tests/behavior/async_delete.rs @@ -133,7 +133,7 @@ pub async fn test_delete_stream(op: Operator) -> Result<()> { } // Gdrive think that this test is an abuse of their service and redirect us // to an infinite loop. Let's ignore this test for gdrive. - if op.info().scheme() == Scheme::Gdrive { + if op.info().scheme() == services::GDRIVE_SCHEME { return Ok(()); } diff --git a/core/tests/behavior/async_list.rs b/core/tests/behavior/async_list.rs index 385a06a8d..6035a57a1 100644 --- a/core/tests/behavior/async_list.rs +++ b/core/tests/behavior/async_list.rs @@ -115,7 +115,7 @@ pub async fn test_list_prefix(op: Operator) -> Result<()> { pub async fn test_list_rich_dir(op: Operator) -> Result<()> { // Gdrive think that this test is an abuse of their service and redirect us // to an infinite loop. Let's ignore this test for gdrive. - if op.info().scheme() == Scheme::Gdrive { + if op.info().scheme() == services::GDRIVE_SCHEME { return Ok(()); } @@ -653,7 +653,7 @@ pub async fn test_list_files_with_deleted(op: Operator) -> Result<()> { pub async fn test_list_with_versions_and_limit(op: Operator) -> Result<()> { // Gdrive think that this test is an abuse of their service and redirect us // to an infinite loop. Let's ignore this test for gdrive. - if op.info().scheme() == Scheme::Gdrive { + if op.info().scheme() == services::GDRIVE_SCHEME { return Ok(()); } if !op.info().full_capability().list_with_versions { diff --git a/core/tests/behavior/async_write.rs b/core/tests/behavior/async_write.rs index 8672ecd33..f672131f5 100644 --- a/core/tests/behavior/async_write.rs +++ b/core/tests/behavior/async_write.rs @@ -116,7 +116,7 @@ pub async fn test_write_with_dir_path(op: Operator) -> Result<()> { /// Write a single file with special chars should succeed. pub async fn test_write_with_special_chars(op: Operator) -> Result<()> { // Ignore test for vercel blob https://github.com/apache/opendal/pull/4103. - if op.info().scheme() == opendal::Scheme::VercelBlob { + if op.info().scheme() == services::VERCEL_BLOB_SCHEME { warn!("ignore test for vercel blob https://github.com/apache/opendal/pull/4103"); return Ok(()); } @@ -694,7 +694,7 @@ pub async fn test_writer_with_append(op: Operator) -> Result<()> { pub async fn test_writer_write_with_overwrite(op: Operator) -> Result<()> { // ghac does not support overwrite - if op.info().scheme() == Scheme::Ghac { + if op.info().scheme() == services::GHAC_SCHEME { return Ok(()); }
