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 a4ca4b8cf refactor: Register service at the start of run time instead
(#6865)
a4ca4b8cf is described below
commit a4ca4b8cfacb53b3e1145e54836973babaa4abfe
Author: Xuanwo <[email protected]>
AuthorDate: Thu Dec 4 20:01:59 2025 +0800
refactor: Register service at the start of run time instead (#6865)
* refactor: Register service at build time instead
Signed-off-by: Xuanwo <[email protected]>
* Fix ctor on msrv
Signed-off-by: Xuanwo <[email protected]>
* relax a bit
Signed-off-by: Xuanwo <[email protected]>
---------
Signed-off-by: Xuanwo <[email protected]>
---
.github/workflows/ci_core.yml | 1 +
core/Cargo.lock | 32 ++++++
core/core/Cargo.toml | 1 +
core/core/src/docs/rfcs/6828_core.md | 2 +-
core/core/src/services/aliyun_drive/mod.rs | 7 ++
core/core/src/services/alluxio/mod.rs | 7 ++
core/core/src/services/azblob/mod.rs | 7 ++
core/core/src/services/azdls/mod.rs | 7 ++
core/core/src/services/azfile/mod.rs | 7 ++
core/core/src/services/b2/mod.rs | 7 ++
core/core/src/services/cacache/mod.rs | 7 ++
core/core/src/services/cloudflare_kv/mod.rs | 7 ++
core/core/src/services/compfs/mod.rs | 7 ++
core/core/src/services/cos/mod.rs | 7 ++
core/core/src/services/d1/mod.rs | 7 ++
core/core/src/services/dashmap/mod.rs | 7 ++
core/core/src/services/dbfs/mod.rs | 7 ++
core/core/src/services/dropbox/mod.rs | 7 ++
core/core/src/services/etcd/mod.rs | 7 ++
core/core/src/services/foundationdb/mod.rs | 7 ++
core/core/src/services/fs/mod.rs | 7 ++
core/core/src/services/ftp/mod.rs | 7 ++
core/core/src/services/gcs/mod.rs | 7 ++
core/core/src/services/gdrive/mod.rs | 7 ++
core/core/src/services/ghac/mod.rs | 7 ++
core/core/src/services/github/mod.rs | 7 ++
core/core/src/services/gridfs/mod.rs | 7 ++
core/core/src/services/hdfs/mod.rs | 7 ++
core/core/src/services/hdfs_native/mod.rs | 7 ++
core/core/src/services/http/mod.rs | 7 ++
core/core/src/services/huggingface/mod.rs | 7 ++
core/core/src/services/ipfs/mod.rs | 7 ++
core/core/src/services/ipmfs/mod.rs | 7 ++
core/core/src/services/koofr/mod.rs | 7 ++
core/core/src/services/lakefs/mod.rs | 7 ++
core/core/src/services/memcached/mod.rs | 7 ++
core/core/src/services/memory/mod.rs | 7 ++
core/core/src/services/mini_moka/mod.rs | 7 ++
core/core/src/services/moka/mod.rs | 7 ++
core/core/src/services/mongodb/mod.rs | 7 ++
core/core/src/services/monoiofs/mod.rs | 7 ++
core/core/src/services/mysql/mod.rs | 7 ++
core/core/src/services/obs/mod.rs | 7 ++
core/core/src/services/onedrive/mod.rs | 7 ++
core/core/src/services/oss/mod.rs | 7 ++
core/core/src/services/pcloud/mod.rs | 7 ++
core/core/src/services/persy/mod.rs | 7 ++
core/core/src/services/postgresql/mod.rs | 7 ++
core/core/src/services/redb/mod.rs | 7 ++
core/core/src/services/redis/mod.rs | 7 ++
core/core/src/services/rocksdb/mod.rs | 7 ++
core/core/src/services/s3/mod.rs | 7 ++
core/core/src/services/seafile/mod.rs | 7 ++
core/core/src/services/sftp/mod.rs | 7 ++
core/core/src/services/sled/mod.rs | 7 ++
core/core/src/services/sqlite/mod.rs | 7 ++
core/core/src/services/surrealdb/mod.rs | 7 ++
core/core/src/services/swift/mod.rs | 7 ++
core/core/src/services/tikv/mod.rs | 7 ++
core/core/src/services/upyun/mod.rs | 7 ++
core/core/src/services/vercel_artifacts/mod.rs | 7 ++
core/core/src/services/vercel_blob/mod.rs | 7 ++
core/core/src/services/webdav/mod.rs | 7 ++
core/core/src/services/webhdfs/mod.rs | 7 ++
core/core/src/services/yandex_disk/mod.rs | 7 ++
core/core/src/types/operator/registry.rs | 132 +------------------------
66 files changed, 464 insertions(+), 131 deletions(-)
diff --git a/.github/workflows/ci_core.yml b/.github/workflows/ci_core.yml
index 9d13d7867..460449ee3 100644
--- a/.github/workflows/ci_core.yml
+++ b/.github/workflows/ci_core.yml
@@ -94,6 +94,7 @@ jobs:
cargo update zerofrom --precise 0.1.5
cargo update idna_adapter --precise 1.2.0
cargo update litemap --precise 0.7.4
+ cargo update ctor --precise 0.6.1
cargo +${OPENDAL_MSRV} clippy -- -D warnings
build_default_features:
diff --git a/core/Cargo.lock b/core/Cargo.lock
index 8993b5829..9c7b5927e 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -2223,6 +2223,22 @@ dependencies = [
"syn 2.0.110",
]
+[[package]]
+name = "ctor"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb230974aaf0aca4d71665bed0aca156cf43b764fcb9583b69c6c3e686f35e72"
+dependencies = [
+ "ctor-proc-macro",
+ "dtor",
+]
+
+[[package]]
+name = "ctor-proc-macro"
+version = "0.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1"
+
[[package]]
name = "ctr"
version = "0.9.2"
@@ -2607,6 +2623,21 @@ dependencies = [
"dtoa",
]
+[[package]]
+name = "dtor"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301"
+dependencies = [
+ "dtor-proc-macro",
+]
+
+[[package]]
+name = "dtor-proc-macro"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5"
+
[[package]]
name = "dunce"
version = "1.0.5"
@@ -5429,6 +5460,7 @@ dependencies = [
"compio",
"crc32c",
"criterion",
+ "ctor",
"dashmap 6.1.0",
"divan",
"dotenvy",
diff --git a/core/core/Cargo.toml b/core/core/Cargo.toml
index 666962a1d..4082d9185 100644
--- a/core/core/Cargo.toml
+++ b/core/core/Cargo.toml
@@ -232,6 +232,7 @@ jiff = { version = "0.2.15", features = ["serde"] }
log = "0.4"
md-5 = "0.10"
mea = { version = "0.5.1" }
+ctor = "0.6"
percent-encoding = "2"
quick-xml = { version = "0.38", features = ["serialize", "overlapped-lists"] }
reqwest = { version = "0.12.24", features = [
diff --git a/core/core/src/docs/rfcs/6828_core.md
b/core/core/src/docs/rfcs/6828_core.md
index 0276dd515..2ef54a627 100644
--- a/core/core/src/docs/rfcs/6828_core.md
+++ b/core/core/src/docs/rfcs/6828_core.md
@@ -50,7 +50,7 @@ opendal = { version = "0.56", features = ["service-s3",
"layer-logging"] }
- `opendal` facade
- Depends on `opendal-core` (mandatory), `opendal-layer-*` and
`opendal-service-*` as optional deps behind features.
- Re-exports `core::{Operator, Result, ...}`, critical layers, and optional
services/layers.
- - On build, calls `register_builtin_services` that invokes each enabled
service crate’s `register` function to populate `DEFAULT_OPERATOR_REGISTRY`.
+ - On build, each enabled service self-registers via a `ctor` initializer to
populate `DEFAULT_OPERATOR_REGISTRY`.
- Maintains feature aliases for one major version (e.g., `services-s3` ->
`service-s3`, `layers-logging` -> `layer-logging`).
## Feature matrix
diff --git a/core/core/src/services/aliyun_drive/mod.rs
b/core/core/src/services/aliyun_drive/mod.rs
index 7cc6a5d9b..e7c54d0a2 100644
--- a/core/core/src/services/aliyun_drive/mod.rs
+++ b/core/core/src/services/aliyun_drive/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for aliyun-drive service.
pub const ALIYUN_DRIVE_SCHEME: &str = "aliyun-drive";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::AliyunDriveBuilder as AliyunDrive;
pub use config::AliyunDriveConfig;
+
+#[ctor::ctor]
+fn register_aliyundrive_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<AliyunDrive>(ALIYUN_DRIVE_SCHEME);
+}
diff --git a/core/core/src/services/alluxio/mod.rs
b/core/core/src/services/alluxio/mod.rs
index 6fa29ade2..8b420ee98 100644
--- a/core/core/src/services/alluxio/mod.rs
+++ b/core/core/src/services/alluxio/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for alluxio service.
pub const ALLUXIO_SCHEME: &str = "alluxio";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::AlluxioBuilder as Alluxio;
pub use config::AlluxioConfig;
+
+#[ctor::ctor]
+fn register_alluxio_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Alluxio>(ALLUXIO_SCHEME);
+}
diff --git a/core/core/src/services/azblob/mod.rs
b/core/core/src/services/azblob/mod.rs
index d4c630c89..75a1d7211 100644
--- a/core/core/src/services/azblob/mod.rs
+++ b/core/core/src/services/azblob/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for azblob service.
pub const AZBLOB_SCHEME: &str = "azblob";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
pub(crate) mod core;
@@ -28,3 +30,8 @@ pub(crate) mod writer;
pub use backend::AzblobBuilder as Azblob;
pub use config::AzblobConfig;
+
+#[ctor::ctor]
+fn register_azblob_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Azblob>(AZBLOB_SCHEME);
+}
diff --git a/core/core/src/services/azdls/mod.rs
b/core/core/src/services/azdls/mod.rs
index 90dc9ab68..7a75dae09 100644
--- a/core/core/src/services/azdls/mod.rs
+++ b/core/core/src/services/azdls/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for azdls service.
pub const AZDLS_SCHEME: &str = "azdls";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::AzdlsBuilder as Azdls;
pub use config::AzdlsConfig;
+
+#[ctor::ctor]
+fn register_azdls_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Azdls>(AZDLS_SCHEME);
+}
diff --git a/core/core/src/services/azfile/mod.rs
b/core/core/src/services/azfile/mod.rs
index 971b9103e..c659719f8 100644
--- a/core/core/src/services/azfile/mod.rs
+++ b/core/core/src/services/azfile/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for azfile service.
pub const AZFILE_SCHEME: &str = "azfile";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::AzfileBuilder as Azfile;
pub use config::AzfileConfig;
+
+#[ctor::ctor]
+fn register_azfile_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Azfile>(AZFILE_SCHEME);
+}
diff --git a/core/core/src/services/b2/mod.rs b/core/core/src/services/b2/mod.rs
index 7cd38bc92..09436541e 100644
--- a/core/core/src/services/b2/mod.rs
+++ b/core/core/src/services/b2/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for b2 service.
pub const B2_SCHEME: &str = "b2";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::B2Builder as B2;
pub use config::B2Config;
+
+#[ctor::ctor]
+fn register_b2_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<B2>(B2_SCHEME);
+}
diff --git a/core/core/src/services/cacache/mod.rs
b/core/core/src/services/cacache/mod.rs
index f699c57f7..236836a2b 100644
--- a/core/core/src/services/cacache/mod.rs
+++ b/core/core/src/services/cacache/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for cacache service.
pub const CACACHE_SCHEME: &str = "cacache";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::CacacheBuilder as Cacache;
pub use config::CacacheConfig;
+
+#[ctor::ctor]
+fn register_cacache_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Cacache>(CACACHE_SCHEME);
+}
diff --git a/core/core/src/services/cloudflare_kv/mod.rs
b/core/core/src/services/cloudflare_kv/mod.rs
index da5ed5b25..5f5d7ae1f 100644
--- a/core/core/src/services/cloudflare_kv/mod.rs
+++ b/core/core/src/services/cloudflare_kv/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for cloudflare-kv service.
pub const CLOUDFLARE_KV_SCHEME: &str = "cloudflare-kv";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ mod writer;
pub use backend::CloudflareKvBuilder as CloudflareKv;
pub use config::CloudflareKvConfig;
+
+#[ctor::ctor]
+fn register_cloudflarekv_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<CloudflareKv>(CLOUDFLARE_KV_SCHEME);
+}
diff --git a/core/core/src/services/compfs/mod.rs
b/core/core/src/services/compfs/mod.rs
index 00c909c78..5f51aa2ed 100644
--- a/core/core/src/services/compfs/mod.rs
+++ b/core/core/src/services/compfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for compfs service.
pub const COMPFS_SCHEME: &str = "compfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::CompfsBuilder as Compfs;
pub use config::CompfsConfig;
+
+#[ctor::ctor]
+fn register_compfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Compfs>(COMPFS_SCHEME);
+}
diff --git a/core/core/src/services/cos/mod.rs
b/core/core/src/services/cos/mod.rs
index d4c22e003..f2d4ca515 100644
--- a/core/core/src/services/cos/mod.rs
+++ b/core/core/src/services/cos/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for cos service.
pub const COS_SCHEME: &str = "cos";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::CosBuilder as Cos;
pub use config::CosConfig;
+
+#[ctor::ctor]
+fn register_cos_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Cos>(COS_SCHEME);
+}
diff --git a/core/core/src/services/d1/mod.rs b/core/core/src/services/d1/mod.rs
index 6d275db5b..d773e8f86 100644
--- a/core/core/src/services/d1/mod.rs
+++ b/core/core/src/services/d1/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for d1 service.
pub const D1_SCHEME: &str = "d1";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::D1Builder as D1;
pub use config::D1Config;
+
+#[ctor::ctor]
+fn register_d1_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<D1>(D1_SCHEME);
+}
diff --git a/core/core/src/services/dashmap/mod.rs
b/core/core/src/services/dashmap/mod.rs
index 1357e67ff..eff210847 100644
--- a/core/core/src/services/dashmap/mod.rs
+++ b/core/core/src/services/dashmap/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for dashmap service.
pub const DASHMAP_SCHEME: &str = "dashmap";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::DashmapBuilder as Dashmap;
pub use config::DashmapConfig;
+
+#[ctor::ctor]
+fn register_dashmap_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Dashmap>(DASHMAP_SCHEME);
+}
diff --git a/core/core/src/services/dbfs/mod.rs
b/core/core/src/services/dbfs/mod.rs
index c09175cb2..0b7c23d77 100644
--- a/core/core/src/services/dbfs/mod.rs
+++ b/core/core/src/services/dbfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for dbfs service.
pub const DBFS_SCHEME: &str = "dbfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::DbfsBuilder as Dbfs;
pub use config::DbfsConfig;
+
+#[ctor::ctor]
+fn register_dbfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Dbfs>(DBFS_SCHEME);
+}
diff --git a/core/core/src/services/dropbox/mod.rs
b/core/core/src/services/dropbox/mod.rs
index 7efc88d97..3195bf5e5 100644
--- a/core/core/src/services/dropbox/mod.rs
+++ b/core/core/src/services/dropbox/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for dropbox service.
pub const DROPBOX_SCHEME: &str = "dropbox";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod builder;
mod config;
@@ -29,3 +31,8 @@ mod writer;
pub use builder::DropboxBuilder as Dropbox;
pub use config::DropboxConfig;
+
+#[ctor::ctor]
+fn register_dropbox_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Dropbox>(DROPBOX_SCHEME);
+}
diff --git a/core/core/src/services/etcd/mod.rs
b/core/core/src/services/etcd/mod.rs
index cb0837db6..a28e5fdca 100644
--- a/core/core/src/services/etcd/mod.rs
+++ b/core/core/src/services/etcd/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for etcd service.
pub const ETCD_SCHEME: &str = "etcd";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::EtcdBuilder as Etcd;
pub use config::EtcdConfig;
+
+#[ctor::ctor]
+fn register_etcd_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Etcd>(ETCD_SCHEME);
+}
diff --git a/core/core/src/services/foundationdb/mod.rs
b/core/core/src/services/foundationdb/mod.rs
index 7d29dd776..cf67f3f0b 100644
--- a/core/core/src/services/foundationdb/mod.rs
+++ b/core/core/src/services/foundationdb/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for foundationdb service.
pub const FOUNDATIONDB_SCHEME: &str = "foundationdb";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::FoundationdbBuilder as Foundationdb;
pub use config::FoundationdbConfig;
+
+#[ctor::ctor]
+fn register_foundationdb_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Foundationdb>(FOUNDATIONDB_SCHEME);
+}
diff --git a/core/core/src/services/fs/mod.rs b/core/core/src/services/fs/mod.rs
index b463d11df..96b064718 100644
--- a/core/core/src/services/fs/mod.rs
+++ b/core/core/src/services/fs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for fs service.
pub const FS_SCHEME: &str = "fs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ mod writer;
pub use backend::FsBuilder as Fs;
pub use config::FsConfig;
+
+#[ctor::ctor]
+fn register_fs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Fs>(FS_SCHEME);
+}
diff --git a/core/core/src/services/ftp/mod.rs
b/core/core/src/services/ftp/mod.rs
index 9d8047b0c..cead8f392 100644
--- a/core/core/src/services/ftp/mod.rs
+++ b/core/core/src/services/ftp/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for ftp service.
pub const FTP_SCHEME: &str = "ftp";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ mod writer;
pub use backend::FtpBuilder as Ftp;
pub use config::FtpConfig;
+
+#[ctor::ctor]
+fn register_ftp_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Ftp>(FTP_SCHEME);
+}
diff --git a/core/core/src/services/gcs/mod.rs
b/core/core/src/services/gcs/mod.rs
index ccdf38253..437e9aa14 100644
--- a/core/core/src/services/gcs/mod.rs
+++ b/core/core/src/services/gcs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for gcs service.
pub const GCS_SCHEME: &str = "gcs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ mod writer;
pub use backend::GcsBuilder as Gcs;
pub use config::GcsConfig;
+
+#[ctor::ctor]
+fn register_gcs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Gcs>(GCS_SCHEME);
+}
diff --git a/core/core/src/services/gdrive/mod.rs
b/core/core/src/services/gdrive/mod.rs
index 11d4cb609..25d6f1aed 100644
--- a/core/core/src/services/gdrive/mod.rs
+++ b/core/core/src/services/gdrive/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for gdrive service.
pub const GDRIVE_SCHEME: &str = "gdrive";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod builder;
mod config;
@@ -29,3 +31,8 @@ mod writer;
pub use builder::GdriveBuilder as Gdrive;
pub use config::GdriveConfig;
+
+#[ctor::ctor]
+fn register_gdrive_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Gdrive>(GDRIVE_SCHEME);
+}
diff --git a/core/core/src/services/ghac/mod.rs
b/core/core/src/services/ghac/mod.rs
index f7e65f313..c35782850 100644
--- a/core/core/src/services/ghac/mod.rs
+++ b/core/core/src/services/ghac/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for ghac service.
pub const GHAC_SCHEME: &str = "ghac";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::GhacBuilder as Ghac;
pub use config::GhacConfig;
+
+#[ctor::ctor]
+fn register_ghac_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Ghac>(GHAC_SCHEME);
+}
diff --git a/core/core/src/services/github/mod.rs
b/core/core/src/services/github/mod.rs
index 4852744f0..9cb8c0abd 100644
--- a/core/core/src/services/github/mod.rs
+++ b/core/core/src/services/github/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for github service.
pub const GITHUB_SCHEME: &str = "github";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::GithubBuilder as Github;
pub use config::GithubConfig;
+
+#[ctor::ctor]
+fn register_github_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Github>(GITHUB_SCHEME);
+}
diff --git a/core/core/src/services/gridfs/mod.rs
b/core/core/src/services/gridfs/mod.rs
index e969369ae..93d4fe611 100644
--- a/core/core/src/services/gridfs/mod.rs
+++ b/core/core/src/services/gridfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for gridfs service.
pub const GRIDFS_SCHEME: &str = "gridfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::GridfsBuilder as Gridfs;
pub use config::GridfsConfig;
+
+#[ctor::ctor]
+fn register_gridfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Gridfs>(GRIDFS_SCHEME);
+}
diff --git a/core/core/src/services/hdfs/mod.rs
b/core/core/src/services/hdfs/mod.rs
index 7b0f5fd85..de2c0e349 100644
--- a/core/core/src/services/hdfs/mod.rs
+++ b/core/core/src/services/hdfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for hdfs service.
pub const HDFS_SCHEME: &str = "hdfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::HdfsBuilder as Hdfs;
pub use config::HdfsConfig;
+
+#[ctor::ctor]
+fn register_hdfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Hdfs>(HDFS_SCHEME);
+}
diff --git a/core/core/src/services/hdfs_native/mod.rs
b/core/core/src/services/hdfs_native/mod.rs
index 81f33cda7..6ff307f5a 100644
--- a/core/core/src/services/hdfs_native/mod.rs
+++ b/core/core/src/services/hdfs_native/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for hdfs-native service.
pub const HDFS_NATIVE_SCHEME: &str = "hdfs-native";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ mod writer;
pub use backend::HdfsNativeBuilder as HdfsNative;
pub use config::HdfsNativeConfig;
+
+#[ctor::ctor]
+fn register_hdfsnative_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<HdfsNative>(HDFS_NATIVE_SCHEME);
+}
diff --git a/core/core/src/services/http/mod.rs
b/core/core/src/services/http/mod.rs
index af2440287..5b3975d7b 100644
--- a/core/core/src/services/http/mod.rs
+++ b/core/core/src/services/http/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for http service.
pub const HTTP_SCHEME: &str = "http";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -25,3 +27,8 @@ mod error;
pub use backend::HttpBuilder as Http;
pub use config::HttpConfig;
+
+#[ctor::ctor]
+fn register_http_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Http>(HTTP_SCHEME);
+}
diff --git a/core/core/src/services/huggingface/mod.rs
b/core/core/src/services/huggingface/mod.rs
index 68b9d09a3..3576c2216 100644
--- a/core/core/src/services/huggingface/mod.rs
+++ b/core/core/src/services/huggingface/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for huggingface service.
pub const HUGGINGFACE_SCHEME: &str = "huggingface";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod lister;
pub use backend::HuggingfaceBuilder as Huggingface;
pub use config::HuggingfaceConfig;
+
+#[ctor::ctor]
+fn register_huggingface_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Huggingface>(HUGGINGFACE_SCHEME);
+}
diff --git a/core/core/src/services/ipfs/mod.rs
b/core/core/src/services/ipfs/mod.rs
index 71c48b8bd..59e68e5f9 100644
--- a/core/core/src/services/ipfs/mod.rs
+++ b/core/core/src/services/ipfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for ipfs service.
pub const IPFS_SCHEME: &str = "ipfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod ipld;
pub use backend::IpfsBuilder as Ipfs;
pub use config::IpfsConfig;
+
+#[ctor::ctor]
+fn register_ipfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Ipfs>(IPFS_SCHEME);
+}
diff --git a/core/core/src/services/ipmfs/mod.rs
b/core/core/src/services/ipmfs/mod.rs
index b1ae29161..58f92b507 100644
--- a/core/core/src/services/ipmfs/mod.rs
+++ b/core/core/src/services/ipmfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for ipmfs service.
pub const IPMFS_SCHEME: &str = "ipmfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod builder;
mod config;
@@ -29,3 +31,8 @@ mod writer;
pub use builder::IpmfsBuilder as Ipmfs;
pub use config::IpmfsConfig;
+
+#[ctor::ctor]
+fn register_ipmfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Ipmfs>(IPMFS_SCHEME);
+}
diff --git a/core/core/src/services/koofr/mod.rs
b/core/core/src/services/koofr/mod.rs
index eabacd782..fe86028e4 100644
--- a/core/core/src/services/koofr/mod.rs
+++ b/core/core/src/services/koofr/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for koofr service.
pub const KOOFR_SCHEME: &str = "koofr";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::KoofrBuilder as Koofr;
pub use config::KoofrConfig;
+
+#[ctor::ctor]
+fn register_koofr_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Koofr>(KOOFR_SCHEME);
+}
diff --git a/core/core/src/services/lakefs/mod.rs
b/core/core/src/services/lakefs/mod.rs
index e4cef817c..cc55ed939 100644
--- a/core/core/src/services/lakefs/mod.rs
+++ b/core/core/src/services/lakefs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for lakefs service.
pub const LAKEFS_SCHEME: &str = "lakefs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::LakefsBuilder as Lakefs;
pub use config::LakefsConfig;
+
+#[ctor::ctor]
+fn register_lakefs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Lakefs>(LAKEFS_SCHEME);
+}
diff --git a/core/core/src/services/memcached/mod.rs
b/core/core/src/services/memcached/mod.rs
index 7bd879b7f..c10fef6a0 100644
--- a/core/core/src/services/memcached/mod.rs
+++ b/core/core/src/services/memcached/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for memcached service.
pub const MEMCACHED_SCHEME: &str = "memcached";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod binary;
mod config;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::MemcachedBuilder as Memcached;
pub use config::MemcachedConfig;
+
+#[ctor::ctor]
+fn register_memcached_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Memcached>(MEMCACHED_SCHEME);
+}
diff --git a/core/core/src/services/memory/mod.rs
b/core/core/src/services/memory/mod.rs
index 71af2d39d..80a0bf3da 100644
--- a/core/core/src/services/memory/mod.rs
+++ b/core/core/src/services/memory/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for memory service.
pub const MEMORY_SCHEME: &str = "memory";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::MemoryBuilder as Memory;
pub use config::MemoryConfig;
+
+#[ctor::ctor]
+fn register_memory_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Memory>(MEMORY_SCHEME);
+}
diff --git a/core/core/src/services/mini_moka/mod.rs
b/core/core/src/services/mini_moka/mod.rs
index 216248185..1df625522 100644
--- a/core/core/src/services/mini_moka/mod.rs
+++ b/core/core/src/services/mini_moka/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for mini-moka service.
pub const MINI_MOKA_SCHEME: &str = "mini-moka";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::MiniMokaBuilder as MiniMoka;
pub use config::MiniMokaConfig;
+
+#[ctor::ctor]
+fn register_minimoka_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<MiniMoka>(MINI_MOKA_SCHEME);
+}
diff --git a/core/core/src/services/moka/mod.rs
b/core/core/src/services/moka/mod.rs
index ea5bfc216..6d5ca4b64 100644
--- a/core/core/src/services/moka/mod.rs
+++ b/core/core/src/services/moka/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for moka service.
pub const MOKA_SCHEME: &str = "moka";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ pub use backend::MokaBuilder as Moka;
pub use backend::MokaCacheBuilder;
pub use config::MokaConfig;
pub use core::MokaValue;
+
+#[ctor::ctor]
+fn register_moka_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Moka>(MOKA_SCHEME);
+}
diff --git a/core/core/src/services/mongodb/mod.rs
b/core/core/src/services/mongodb/mod.rs
index a2a6b7e7e..e2fc75c48 100644
--- a/core/core/src/services/mongodb/mod.rs
+++ b/core/core/src/services/mongodb/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for mongodb service.
pub const MONGODB_SCHEME: &str = "mongodb";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::MongodbBuilder as Mongodb;
pub use config::MongodbConfig;
+
+#[ctor::ctor]
+fn register_mongodb_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Mongodb>(MONGODB_SCHEME);
+}
diff --git a/core/core/src/services/monoiofs/mod.rs
b/core/core/src/services/monoiofs/mod.rs
index 2beaae63d..1915761d2 100644
--- a/core/core/src/services/monoiofs/mod.rs
+++ b/core/core/src/services/monoiofs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for monoiofs service.
pub const MONOIOFS_SCHEME: &str = "monoiofs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::MonoiofsBuilder as Monoiofs;
pub use config::MonoiofsConfig;
+
+#[ctor::ctor]
+fn register_monoiofs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Monoiofs>(MONOIOFS_SCHEME);
+}
diff --git a/core/core/src/services/mysql/mod.rs
b/core/core/src/services/mysql/mod.rs
index 5ccf41199..3bd42214e 100644
--- a/core/core/src/services/mysql/mod.rs
+++ b/core/core/src/services/mysql/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for mysql service.
pub const MYSQL_SCHEME: &str = "mysql";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::MysqlBuilder as Mysql;
pub use config::MysqlConfig;
+
+#[ctor::ctor]
+fn register_mysql_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Mysql>(MYSQL_SCHEME);
+}
diff --git a/core/core/src/services/obs/mod.rs
b/core/core/src/services/obs/mod.rs
index 417ef04ae..b9be65574 100644
--- a/core/core/src/services/obs/mod.rs
+++ b/core/core/src/services/obs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for obs service.
pub const OBS_SCHEME: &str = "obs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::ObsBuilder as Obs;
pub use config::ObsConfig;
+
+#[ctor::ctor]
+fn register_obs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Obs>(OBS_SCHEME);
+}
diff --git a/core/core/src/services/onedrive/mod.rs
b/core/core/src/services/onedrive/mod.rs
index 5f78a0d78..ebf9f189e 100644
--- a/core/core/src/services/onedrive/mod.rs
+++ b/core/core/src/services/onedrive/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for onedrive service.
pub const ONEDRIVE_SCHEME: &str = "onedrive";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod builder;
mod config;
@@ -30,3 +32,8 @@ mod writer;
pub use builder::OnedriveBuilder as Onedrive;
pub use config::OnedriveConfig;
+
+#[ctor::ctor]
+fn register_onedrive_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Onedrive>(ONEDRIVE_SCHEME);
+}
diff --git a/core/core/src/services/oss/mod.rs
b/core/core/src/services/oss/mod.rs
index 62d233c1e..cf7055624 100644
--- a/core/core/src/services/oss/mod.rs
+++ b/core/core/src/services/oss/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for oss service.
pub const OSS_SCHEME: &str = "oss";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::OssBuilder as Oss;
pub use config::OssConfig;
+
+#[ctor::ctor]
+fn register_oss_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Oss>(OSS_SCHEME);
+}
diff --git a/core/core/src/services/pcloud/mod.rs
b/core/core/src/services/pcloud/mod.rs
index e01002900..3295b09ba 100644
--- a/core/core/src/services/pcloud/mod.rs
+++ b/core/core/src/services/pcloud/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for pcloud service.
pub const PCLOUD_SCHEME: &str = "pcloud";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::PcloudBuilder as Pcloud;
pub use config::PcloudConfig;
+
+#[ctor::ctor]
+fn register_pcloud_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Pcloud>(PCLOUD_SCHEME);
+}
diff --git a/core/core/src/services/persy/mod.rs
b/core/core/src/services/persy/mod.rs
index 9ebbf8dfd..1dd724b05 100644
--- a/core/core/src/services/persy/mod.rs
+++ b/core/core/src/services/persy/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for persy service.
pub const PERSY_SCHEME: &str = "persy";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::PersyBuilder as Persy;
pub use config::PersyConfig;
+
+#[ctor::ctor]
+fn register_persy_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Persy>(PERSY_SCHEME);
+}
diff --git a/core/core/src/services/postgresql/mod.rs
b/core/core/src/services/postgresql/mod.rs
index ca2fdc086..25863aee0 100644
--- a/core/core/src/services/postgresql/mod.rs
+++ b/core/core/src/services/postgresql/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for postgresql service.
pub const POSTGRESQL_SCHEME: &str = "postgresql";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::PostgresqlBuilder as Postgresql;
pub use config::PostgresqlConfig;
+
+#[ctor::ctor]
+fn register_postgresql_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Postgresql>(POSTGRESQL_SCHEME);
+}
diff --git a/core/core/src/services/redb/mod.rs
b/core/core/src/services/redb/mod.rs
index 05b421448..3d653a1e6 100644
--- a/core/core/src/services/redb/mod.rs
+++ b/core/core/src/services/redb/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for redb service.
pub const REDB_SCHEME: &str = "redb";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::RedbBuilder as Redb;
pub use config::RedbConfig;
+
+#[ctor::ctor]
+fn register_redb_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Redb>(REDB_SCHEME);
+}
diff --git a/core/core/src/services/redis/mod.rs
b/core/core/src/services/redis/mod.rs
index d0610f508..6d0563bcc 100644
--- a/core/core/src/services/redis/mod.rs
+++ b/core/core/src/services/redis/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for redis service.
pub const REDIS_SCHEME: &str = "redis";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::RedisBuilder as Redis;
pub use config::RedisConfig;
+
+#[ctor::ctor]
+fn register_redis_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Redis>(REDIS_SCHEME);
+}
diff --git a/core/core/src/services/rocksdb/mod.rs
b/core/core/src/services/rocksdb/mod.rs
index a4788f093..4447dc778 100644
--- a/core/core/src/services/rocksdb/mod.rs
+++ b/core/core/src/services/rocksdb/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for rocksdb service.
pub const ROCKSDB_SCHEME: &str = "rocksdb";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::RocksdbBuilder as Rocksdb;
pub use config::RocksdbConfig;
+
+#[ctor::ctor]
+fn register_rocksdb_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Rocksdb>(ROCKSDB_SCHEME);
+}
diff --git a/core/core/src/services/s3/mod.rs b/core/core/src/services/s3/mod.rs
index 5c8bb617b..432f8f45e 100644
--- a/core/core/src/services/s3/mod.rs
+++ b/core/core/src/services/s3/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for s3 service.
pub const S3_SCHEME: &str = "s3";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::S3Builder as S3;
pub use config::S3Config;
+
+#[ctor::ctor]
+fn register_s3_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<S3>(S3_SCHEME);
+}
diff --git a/core/core/src/services/seafile/mod.rs
b/core/core/src/services/seafile/mod.rs
index d658fff41..94abafc0b 100644
--- a/core/core/src/services/seafile/mod.rs
+++ b/core/core/src/services/seafile/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for seafile service.
pub const SEAFILE_SCHEME: &str = "seafile";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::SeafileBuilder as Seafile;
pub use config::SeafileConfig;
+
+#[ctor::ctor]
+fn register_seafile_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Seafile>(SEAFILE_SCHEME);
+}
diff --git a/core/core/src/services/sftp/mod.rs
b/core/core/src/services/sftp/mod.rs
index cb608983d..5712c4bdc 100644
--- a/core/core/src/services/sftp/mod.rs
+++ b/core/core/src/services/sftp/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for sftp service.
pub const SFTP_SCHEME: &str = "sftp";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -30,3 +32,8 @@ mod writer;
pub use backend::SftpBuilder as Sftp;
pub use config::SftpConfig;
+
+#[ctor::ctor]
+fn register_sftp_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Sftp>(SFTP_SCHEME);
+}
diff --git a/core/core/src/services/sled/mod.rs
b/core/core/src/services/sled/mod.rs
index 70f043b0e..915fa9de3 100644
--- a/core/core/src/services/sled/mod.rs
+++ b/core/core/src/services/sled/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for sled service.
pub const SLED_SCHEME: &str = "sled";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -27,3 +29,8 @@ mod writer;
pub use backend::SledBuilder as Sled;
pub use config::SledConfig;
+
+#[ctor::ctor]
+fn register_sled_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Sled>(SLED_SCHEME);
+}
diff --git a/core/core/src/services/sqlite/mod.rs
b/core/core/src/services/sqlite/mod.rs
index c498866e4..c6783d57f 100644
--- a/core/core/src/services/sqlite/mod.rs
+++ b/core/core/src/services/sqlite/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for sqlite service.
pub const SQLITE_SCHEME: &str = "sqlite";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::SqliteBuilder as Sqlite;
pub use config::SqliteConfig;
+
+#[ctor::ctor]
+fn register_sqlite_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Sqlite>(SQLITE_SCHEME);
+}
diff --git a/core/core/src/services/surrealdb/mod.rs
b/core/core/src/services/surrealdb/mod.rs
index 94437dda4..722ace1e5 100644
--- a/core/core/src/services/surrealdb/mod.rs
+++ b/core/core/src/services/surrealdb/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for surrealdb service.
pub const SURREALDB_SCHEME: &str = "surrealdb";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::SurrealdbBuilder as Surrealdb;
pub use config::SurrealdbConfig;
+
+#[ctor::ctor]
+fn register_surrealdb_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Surrealdb>(SURREALDB_SCHEME);
+}
diff --git a/core/core/src/services/swift/mod.rs
b/core/core/src/services/swift/mod.rs
index 4eff77934..506de54d5 100644
--- a/core/core/src/services/swift/mod.rs
+++ b/core/core/src/services/swift/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for swift service.
pub const SWIFT_SCHEME: &str = "swift";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::SwiftBuilder as Swift;
pub use config::SwiftConfig;
+
+#[ctor::ctor]
+fn register_swift_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Swift>(SWIFT_SCHEME);
+}
diff --git a/core/core/src/services/tikv/mod.rs
b/core/core/src/services/tikv/mod.rs
index 639edf7bd..6bd30e843 100644
--- a/core/core/src/services/tikv/mod.rs
+++ b/core/core/src/services/tikv/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for tikv service.
pub const TIKV_SCHEME: &str = "tikv";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -26,3 +28,8 @@ mod writer;
pub use backend::TikvBuilder as Tikv;
pub use config::TikvConfig;
+
+#[ctor::ctor]
+fn register_tikv_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Tikv>(TIKV_SCHEME);
+}
diff --git a/core/core/src/services/upyun/mod.rs
b/core/core/src/services/upyun/mod.rs
index 9f65e9405..960f2d241 100644
--- a/core/core/src/services/upyun/mod.rs
+++ b/core/core/src/services/upyun/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for upyun service.
pub const UPYUN_SCHEME: &str = "upyun";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::UpyunBuilder as Upyun;
pub use config::UpyunConfig;
+
+#[ctor::ctor]
+fn register_upyun_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Upyun>(UPYUN_SCHEME);
+}
diff --git a/core/core/src/services/vercel_artifacts/mod.rs
b/core/core/src/services/vercel_artifacts/mod.rs
index c160d557e..fe3ae58fc 100644
--- a/core/core/src/services/vercel_artifacts/mod.rs
+++ b/core/core/src/services/vercel_artifacts/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for vercel-artifacts service.
pub const VERCEL_ARTIFACTS_SCHEME: &str = "vercel-artifacts";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod builder;
mod config;
@@ -27,3 +29,8 @@ mod writer;
pub use builder::VercelArtifactsBuilder as VercelArtifacts;
pub use config::VercelArtifactsConfig;
+
+#[ctor::ctor]
+fn register_vercelartifacts_service() {
+
DEFAULT_OPERATOR_REGISTRY.register::<VercelArtifacts>(VERCEL_ARTIFACTS_SCHEME);
+}
diff --git a/core/core/src/services/vercel_blob/mod.rs
b/core/core/src/services/vercel_blob/mod.rs
index f989d5bf0..684eab202 100644
--- a/core/core/src/services/vercel_blob/mod.rs
+++ b/core/core/src/services/vercel_blob/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for vercel-blob service.
pub const VERCEL_BLOB_SCHEME: &str = "vercel-blob";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::VercelBlobBuilder as VercelBlob;
pub use config::VercelBlobConfig;
+
+#[ctor::ctor]
+fn register_vercelblob_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<VercelBlob>(VERCEL_BLOB_SCHEME);
+}
diff --git a/core/core/src/services/webdav/mod.rs
b/core/core/src/services/webdav/mod.rs
index 7e46b570c..1fd1f194e 100644
--- a/core/core/src/services/webdav/mod.rs
+++ b/core/core/src/services/webdav/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for webdav service.
pub const WEBDAV_SCHEME: &str = "webdav";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::WebdavBuilder as Webdav;
pub use config::WebdavConfig;
+
+#[ctor::ctor]
+fn register_webdav_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Webdav>(WEBDAV_SCHEME);
+}
diff --git a/core/core/src/services/webhdfs/mod.rs
b/core/core/src/services/webhdfs/mod.rs
index 7e9c47125..7dd99edc8 100644
--- a/core/core/src/services/webhdfs/mod.rs
+++ b/core/core/src/services/webhdfs/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for webhdfs service.
pub const WEBHDFS_SCHEME: &str = "webhdfs";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -29,3 +31,8 @@ mod writer;
pub use backend::WebhdfsBuilder as Webhdfs;
pub use config::WebhdfsConfig;
+
+#[ctor::ctor]
+fn register_webhdfs_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<Webhdfs>(WEBHDFS_SCHEME);
+}
diff --git a/core/core/src/services/yandex_disk/mod.rs
b/core/core/src/services/yandex_disk/mod.rs
index 3c2224bdd..271d2da6d 100644
--- a/core/core/src/services/yandex_disk/mod.rs
+++ b/core/core/src/services/yandex_disk/mod.rs
@@ -18,6 +18,8 @@
/// Default scheme for yandex-disk service.
pub const YANDEX_DISK_SCHEME: &str = "yandex-disk";
+use crate::types::DEFAULT_OPERATOR_REGISTRY;
+
mod backend;
mod config;
mod core;
@@ -28,3 +30,8 @@ mod writer;
pub use backend::YandexDiskBuilder as YandexDisk;
pub use config::YandexDiskConfig;
+
+#[ctor::ctor]
+fn register_yandexdisk_service() {
+ DEFAULT_OPERATOR_REGISTRY.register::<YandexDisk>(YANDEX_DISK_SCHEME);
+}
diff --git a/core/core/src/types/operator/registry.rs
b/core/core/src/types/operator/registry.rs
index d4dcf0f2a..8afeee43f 100644
--- a/core/core/src/types/operator/registry.rs
+++ b/core/core/src/types/operator/registry.rs
@@ -26,11 +26,8 @@ use crate::{Error, ErrorKind, Operator, Result};
pub type OperatorFactory = fn(&OperatorUri) -> Result<Operator>;
/// Default registry initialized with builtin services.
-pub static DEFAULT_OPERATOR_REGISTRY: LazyLock<OperatorRegistry> =
LazyLock::new(|| {
- let registry = OperatorRegistry::new();
- register_builtin_services(®istry);
- registry
-});
+pub static DEFAULT_OPERATOR_REGISTRY: LazyLock<OperatorRegistry> =
+ LazyLock::new(OperatorRegistry::new);
/// Global registry that maps schemes to [`OperatorFactory`] functions.
#[derive(Debug, Default)]
@@ -76,131 +73,6 @@ impl OperatorRegistry {
}
}
-fn register_builtin_services(registry: &OperatorRegistry) {
- #[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.
fn factory<C: Configurator>(uri: &OperatorUri) -> Result<Operator> {
let cfg = C::from_uri(uri)?;