opendal 0.1.6.pre.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/Cargo.toml +65 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/performance/mod.rs +32 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- metadata +857 -0
|
@@ -0,0 +1,729 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use tokio::runtime::Handle;
|
|
19
|
+
|
|
20
|
+
use crate::Operator as AsyncOperator;
|
|
21
|
+
use crate::*;
|
|
22
|
+
|
|
23
|
+
/// Use OpenDAL in blocking context.
|
|
24
|
+
///
|
|
25
|
+
/// # Notes
|
|
26
|
+
///
|
|
27
|
+
/// blocking::Operator is a wrapper around [`AsyncOperator`]. It calls async runtimes' `block_on` API to spawn blocking tasks.
|
|
28
|
+
/// Please avoid using blocking::Operator in async context.
|
|
29
|
+
///
|
|
30
|
+
/// # Examples
|
|
31
|
+
///
|
|
32
|
+
/// ## Init in async context
|
|
33
|
+
///
|
|
34
|
+
/// blocking::Operator will use current async context's runtime to handle the async calls.
|
|
35
|
+
///
|
|
36
|
+
/// This is just for initialization. You must use `blocking::Operator` in blocking context.
|
|
37
|
+
///
|
|
38
|
+
/// ```rust,no_run
|
|
39
|
+
/// # use opendal::services;
|
|
40
|
+
/// # use opendal::blocking;
|
|
41
|
+
/// # use opendal::Operator;
|
|
42
|
+
/// # use opendal::Result;
|
|
43
|
+
///
|
|
44
|
+
/// #[tokio::main]
|
|
45
|
+
/// async fn main() -> Result<()> {
|
|
46
|
+
/// // Create fs backend builder.
|
|
47
|
+
/// let mut builder = services::S3::default().bucket("test").region("us-east-1");
|
|
48
|
+
/// let op = Operator::new(builder)?.finish();
|
|
49
|
+
///
|
|
50
|
+
/// // Build an `blocking::Operator` with blocking layer to start operating the storage.
|
|
51
|
+
/// let _: blocking::Operator = blocking::Operator::new(op)?;
|
|
52
|
+
///
|
|
53
|
+
/// Ok(())
|
|
54
|
+
/// }
|
|
55
|
+
/// ```
|
|
56
|
+
///
|
|
57
|
+
/// ## In async context with blocking functions
|
|
58
|
+
///
|
|
59
|
+
/// If `blocking::Operator` is called in blocking function, please fetch a [`tokio::runtime::EnterGuard`]
|
|
60
|
+
/// first. You can use [`Handle::try_current`] first to get the handle and then call [`Handle::enter`].
|
|
61
|
+
/// This often happens in the case that async function calls blocking function.
|
|
62
|
+
///
|
|
63
|
+
/// ```rust,no_run
|
|
64
|
+
/// # use opendal::services;
|
|
65
|
+
/// # use opendal::blocking;
|
|
66
|
+
/// # use opendal::Operator;
|
|
67
|
+
/// # use opendal::Result;
|
|
68
|
+
///
|
|
69
|
+
/// #[tokio::main]
|
|
70
|
+
/// async fn main() -> Result<()> {
|
|
71
|
+
/// let _ = blocking_fn()?;
|
|
72
|
+
/// Ok(())
|
|
73
|
+
/// }
|
|
74
|
+
///
|
|
75
|
+
/// fn blocking_fn() -> Result<blocking::Operator> {
|
|
76
|
+
/// // Create fs backend builder.
|
|
77
|
+
/// let mut builder = services::S3::default().bucket("test").region("us-east-1");
|
|
78
|
+
/// let op = Operator::new(builder)?.finish();
|
|
79
|
+
///
|
|
80
|
+
/// let handle = tokio::runtime::Handle::try_current().unwrap();
|
|
81
|
+
/// let _guard = handle.enter();
|
|
82
|
+
/// // Build an `blocking::Operator` to start operating the storage.
|
|
83
|
+
/// let op: blocking::Operator = blocking::Operator::new(op)?;
|
|
84
|
+
/// Ok(op)
|
|
85
|
+
/// }
|
|
86
|
+
/// ```
|
|
87
|
+
///
|
|
88
|
+
/// ## In blocking context
|
|
89
|
+
///
|
|
90
|
+
/// In a pure blocking context, we can create a runtime and use it to create the `blocking::Operator`.
|
|
91
|
+
///
|
|
92
|
+
/// > The following code uses a global statically created runtime as an example, please manage the
|
|
93
|
+
/// > runtime on demand.
|
|
94
|
+
///
|
|
95
|
+
/// ```rust,no_run
|
|
96
|
+
/// # use std::sync::LazyLock;
|
|
97
|
+
/// # use opendal::services;
|
|
98
|
+
/// # use opendal::blocking;
|
|
99
|
+
/// # use opendal::Operator;
|
|
100
|
+
/// # use opendal::Result;
|
|
101
|
+
///
|
|
102
|
+
/// static RUNTIME: LazyLock<tokio::runtime::Runtime> = LazyLock::new(|| {
|
|
103
|
+
/// tokio::runtime::Builder::new_multi_thread()
|
|
104
|
+
/// .enable_all()
|
|
105
|
+
/// .build()
|
|
106
|
+
/// .unwrap()
|
|
107
|
+
/// });
|
|
108
|
+
///
|
|
109
|
+
/// fn main() -> Result<()> {
|
|
110
|
+
/// // Create fs backend builder.
|
|
111
|
+
/// let mut builder = services::S3::default().bucket("test").region("us-east-1");
|
|
112
|
+
/// let op = Operator::new(builder)?.finish();
|
|
113
|
+
///
|
|
114
|
+
/// // Fetch the `EnterGuard` from global runtime.
|
|
115
|
+
/// let _guard = RUNTIME.enter();
|
|
116
|
+
/// // Build an `blocking::Operator` with blocking layer to start operating the storage.
|
|
117
|
+
/// let _: blocking::Operator = blocking::Operator::new(op)?;
|
|
118
|
+
///
|
|
119
|
+
/// Ok(())
|
|
120
|
+
/// }
|
|
121
|
+
/// ```
|
|
122
|
+
#[derive(Clone, Debug)]
|
|
123
|
+
pub struct Operator {
|
|
124
|
+
handle: tokio::runtime::Handle,
|
|
125
|
+
op: AsyncOperator,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
impl Operator {
|
|
129
|
+
/// Create a new `BlockingLayer` with the current runtime's handle
|
|
130
|
+
pub fn new(op: AsyncOperator) -> Result<Self> {
|
|
131
|
+
Ok(Self {
|
|
132
|
+
handle: Handle::try_current()
|
|
133
|
+
.map_err(|_| Error::new(ErrorKind::Unexpected, "failed to get current handle"))?,
|
|
134
|
+
op,
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/// Create a blocking operator from URI based configuration.
|
|
139
|
+
pub fn from_uri(
|
|
140
|
+
uri: &str,
|
|
141
|
+
options: impl IntoIterator<Item = (String, String)>,
|
|
142
|
+
) -> Result<Self> {
|
|
143
|
+
let op = AsyncOperator::from_uri(uri, options)?;
|
|
144
|
+
Self::new(op)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/// Get information of underlying accessor.
|
|
148
|
+
///
|
|
149
|
+
/// # Examples
|
|
150
|
+
///
|
|
151
|
+
/// ```
|
|
152
|
+
/// # use std::sync::Arc;
|
|
153
|
+
/// use opendal::blocking;
|
|
154
|
+
/// # use anyhow::Result;
|
|
155
|
+
/// use opendal::blocking::Operator;
|
|
156
|
+
///
|
|
157
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
158
|
+
/// let info = op.info();
|
|
159
|
+
/// # Ok(())
|
|
160
|
+
/// # }
|
|
161
|
+
/// ```
|
|
162
|
+
pub fn info(&self) -> OperatorInfo {
|
|
163
|
+
self.op.info()
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/// # Operator blocking API.
|
|
168
|
+
impl Operator {
|
|
169
|
+
/// Get given path's metadata.
|
|
170
|
+
///
|
|
171
|
+
/// # Behavior
|
|
172
|
+
///
|
|
173
|
+
/// ## Services that support `create_dir`
|
|
174
|
+
///
|
|
175
|
+
/// `test` and `test/` may vary in some services such as S3. However, on a local file system,
|
|
176
|
+
/// they're identical. Therefore, the behavior of `stat("test")` and `stat("test/")` might differ
|
|
177
|
+
/// in certain edge cases. Always use `stat("test/")` when you need to access a directory if possible.
|
|
178
|
+
///
|
|
179
|
+
/// Here are the behavior list:
|
|
180
|
+
///
|
|
181
|
+
/// | Case | Path | Result |
|
|
182
|
+
/// |------------------------|-----------------|--------------------------------------------|
|
|
183
|
+
/// | stat existing dir | `abc/` | Metadata with dir mode |
|
|
184
|
+
/// | stat existing file | `abc/def_file` | Metadata with file mode |
|
|
185
|
+
/// | stat dir without `/` | `abc/def_dir` | Error `NotFound` or metadata with dir mode |
|
|
186
|
+
/// | stat file with `/` | `abc/def_file/` | Error `NotFound` |
|
|
187
|
+
/// | stat not existing path | `xyz` | Error `NotFound` |
|
|
188
|
+
///
|
|
189
|
+
/// Refer to [RFC: List Prefix][crate::docs::rfcs::rfc_3243_list_prefix] for more details.
|
|
190
|
+
///
|
|
191
|
+
/// ## Services that not support `create_dir`
|
|
192
|
+
///
|
|
193
|
+
/// For services that not support `create_dir`, `stat("test/")` will return `NotFound` even
|
|
194
|
+
/// when `test/abc` exists since the service won't have the concept of dir. There is nothing
|
|
195
|
+
/// we can do about this.
|
|
196
|
+
///
|
|
197
|
+
/// # Examples
|
|
198
|
+
///
|
|
199
|
+
/// ## Check if file exists
|
|
200
|
+
///
|
|
201
|
+
/// ```
|
|
202
|
+
/// # use anyhow::Result;
|
|
203
|
+
/// # use futures::io;
|
|
204
|
+
/// use opendal::blocking;
|
|
205
|
+
/// # use opendal::blocking::Operator;
|
|
206
|
+
/// use opendal::ErrorKind;
|
|
207
|
+
/// #
|
|
208
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
209
|
+
/// if let Err(e) = op.stat("test") {
|
|
210
|
+
/// if e.kind() == ErrorKind::NotFound {
|
|
211
|
+
/// println!("file not exist")
|
|
212
|
+
/// }
|
|
213
|
+
/// }
|
|
214
|
+
/// # Ok(())
|
|
215
|
+
/// # }
|
|
216
|
+
/// ```
|
|
217
|
+
pub fn stat(&self, path: &str) -> Result<Metadata> {
|
|
218
|
+
self.stat_options(path, options::StatOptions::default())
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/// Get given path's metadata with extra options.
|
|
222
|
+
///
|
|
223
|
+
/// # Behavior
|
|
224
|
+
///
|
|
225
|
+
/// ## Services that support `create_dir`
|
|
226
|
+
///
|
|
227
|
+
/// `test` and `test/` may vary in some services such as S3. However, on a local file system,
|
|
228
|
+
/// they're identical. Therefore, the behavior of `stat("test")` and `stat("test/")` might differ
|
|
229
|
+
/// in certain edge cases. Always use `stat("test/")` when you need to access a directory if possible.
|
|
230
|
+
///
|
|
231
|
+
/// Here are the behavior list:
|
|
232
|
+
///
|
|
233
|
+
/// | Case | Path | Result |
|
|
234
|
+
/// |------------------------|-----------------|--------------------------------------------|
|
|
235
|
+
/// | stat existing dir | `abc/` | Metadata with dir mode |
|
|
236
|
+
/// | stat existing file | `abc/def_file` | Metadata with file mode |
|
|
237
|
+
/// | stat dir without `/` | `abc/def_dir` | Error `NotFound` or metadata with dir mode |
|
|
238
|
+
/// | stat file with `/` | `abc/def_file/` | Error `NotFound` |
|
|
239
|
+
/// | stat not existing path | `xyz` | Error `NotFound` |
|
|
240
|
+
///
|
|
241
|
+
/// Refer to [RFC: List Prefix][crate::docs::rfcs::rfc_3243_list_prefix] for more details.
|
|
242
|
+
///
|
|
243
|
+
/// ## Services that not support `create_dir`
|
|
244
|
+
///
|
|
245
|
+
/// For services that not support `create_dir`, `stat("test/")` will return `NotFound` even
|
|
246
|
+
/// when `test/abc` exists since the service won't have the concept of dir. There is nothing
|
|
247
|
+
/// we can do about this.
|
|
248
|
+
pub fn stat_options(&self, path: &str, opts: options::StatOptions) -> Result<Metadata> {
|
|
249
|
+
self.handle.block_on(self.op.stat_options(path, opts))
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/// Check if this path exists or not.
|
|
253
|
+
///
|
|
254
|
+
/// # Example
|
|
255
|
+
///
|
|
256
|
+
/// ```no_run
|
|
257
|
+
/// use anyhow::Result;
|
|
258
|
+
/// use opendal::blocking;
|
|
259
|
+
/// use opendal::blocking::Operator;
|
|
260
|
+
/// fn test(op: blocking::Operator) -> Result<()> {
|
|
261
|
+
/// let _ = op.exists("test")?;
|
|
262
|
+
///
|
|
263
|
+
/// Ok(())
|
|
264
|
+
/// }
|
|
265
|
+
/// ```
|
|
266
|
+
pub fn exists(&self, path: &str) -> Result<bool> {
|
|
267
|
+
let r = self.stat(path);
|
|
268
|
+
match r {
|
|
269
|
+
Ok(_) => Ok(true),
|
|
270
|
+
Err(err) => match err.kind() {
|
|
271
|
+
ErrorKind::NotFound => Ok(false),
|
|
272
|
+
_ => Err(err),
|
|
273
|
+
},
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/// Create a dir at given path.
|
|
278
|
+
///
|
|
279
|
+
/// # Notes
|
|
280
|
+
///
|
|
281
|
+
/// To indicate that a path is a directory, it is compulsory to include
|
|
282
|
+
/// a trailing / in the path. Failure to do so may result in
|
|
283
|
+
/// `NotADirectory` error being returned by OpenDAL.
|
|
284
|
+
///
|
|
285
|
+
/// # Behavior
|
|
286
|
+
///
|
|
287
|
+
/// - Create on existing dir will succeed.
|
|
288
|
+
/// - Create dir is always recursive, works like `mkdir -p`
|
|
289
|
+
///
|
|
290
|
+
/// # Examples
|
|
291
|
+
///
|
|
292
|
+
/// ```no_run
|
|
293
|
+
/// # use opendal::Result;
|
|
294
|
+
/// use opendal::blocking;
|
|
295
|
+
/// # use opendal::blocking::Operator;
|
|
296
|
+
/// # use futures::TryStreamExt;
|
|
297
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
298
|
+
/// op.create_dir("path/to/dir/")?;
|
|
299
|
+
/// # Ok(())
|
|
300
|
+
/// # }
|
|
301
|
+
/// ```
|
|
302
|
+
pub fn create_dir(&self, path: &str) -> Result<()> {
|
|
303
|
+
self.handle.block_on(self.op.create_dir(path))
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/// Read the whole path into a bytes.
|
|
307
|
+
///
|
|
308
|
+
/// This function will allocate a new bytes internally. For more precise memory control or
|
|
309
|
+
/// reading data lazily, please use [`blocking::Operator::reader`]
|
|
310
|
+
///
|
|
311
|
+
/// # Examples
|
|
312
|
+
///
|
|
313
|
+
/// ```no_run
|
|
314
|
+
/// # use opendal::Result;
|
|
315
|
+
/// use opendal::blocking;
|
|
316
|
+
/// # use opendal::blocking::Operator;
|
|
317
|
+
/// #
|
|
318
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
319
|
+
/// let bs = op.read("path/to/file")?;
|
|
320
|
+
/// # Ok(())
|
|
321
|
+
/// # }
|
|
322
|
+
/// ```
|
|
323
|
+
pub fn read(&self, path: &str) -> Result<Buffer> {
|
|
324
|
+
self.read_options(path, options::ReadOptions::default())
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/// Read the whole path into a bytes with extra options.
|
|
328
|
+
///
|
|
329
|
+
/// This function will allocate a new bytes internally. For more precise memory control or
|
|
330
|
+
/// reading data lazily, please use [`blocking::Operator::reader`]
|
|
331
|
+
pub fn read_options(&self, path: &str, opts: options::ReadOptions) -> Result<Buffer> {
|
|
332
|
+
self.handle.block_on(self.op.read_options(path, opts))
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/// Create a new reader which can read the whole path.
|
|
336
|
+
///
|
|
337
|
+
/// # Examples
|
|
338
|
+
///
|
|
339
|
+
/// ```no_run
|
|
340
|
+
/// # use opendal::Result;
|
|
341
|
+
/// use opendal::blocking;
|
|
342
|
+
/// # use opendal::blocking::Operator;
|
|
343
|
+
/// # use futures::TryStreamExt;
|
|
344
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
345
|
+
/// let r = op.reader("path/to/file")?;
|
|
346
|
+
/// # Ok(())
|
|
347
|
+
/// # }
|
|
348
|
+
/// ```
|
|
349
|
+
pub fn reader(&self, path: &str) -> Result<blocking::Reader> {
|
|
350
|
+
self.reader_options(path, options::ReaderOptions::default())
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/// Create a new reader with extra options
|
|
354
|
+
pub fn reader_options(
|
|
355
|
+
&self,
|
|
356
|
+
path: &str,
|
|
357
|
+
opts: options::ReaderOptions,
|
|
358
|
+
) -> Result<blocking::Reader> {
|
|
359
|
+
let r = self.handle.block_on(self.op.reader_options(path, opts))?;
|
|
360
|
+
Ok(blocking::Reader::new(self.handle.clone(), r))
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/// Write bytes into given path.
|
|
364
|
+
///
|
|
365
|
+
/// # Notes
|
|
366
|
+
///
|
|
367
|
+
/// - Write will make sure all bytes has been written, or an error will be returned.
|
|
368
|
+
///
|
|
369
|
+
/// # Examples
|
|
370
|
+
///
|
|
371
|
+
/// ```no_run
|
|
372
|
+
/// # use opendal::Result;
|
|
373
|
+
/// # use opendal::blocking::Operator;
|
|
374
|
+
/// # use futures::StreamExt;
|
|
375
|
+
/// # use futures::SinkExt;
|
|
376
|
+
/// use bytes::Bytes;
|
|
377
|
+
/// use opendal::blocking;
|
|
378
|
+
///
|
|
379
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
380
|
+
/// op.write("path/to/file", vec![0; 4096])?;
|
|
381
|
+
/// # Ok(())
|
|
382
|
+
/// # }
|
|
383
|
+
/// ```
|
|
384
|
+
pub fn write(&self, path: &str, bs: impl Into<Buffer>) -> Result<Metadata> {
|
|
385
|
+
self.write_options(path, bs, options::WriteOptions::default())
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/// Write data with options.
|
|
389
|
+
///
|
|
390
|
+
/// # Notes
|
|
391
|
+
///
|
|
392
|
+
/// - Write will make sure all bytes has been written, or an error will be returned.
|
|
393
|
+
pub fn write_options(
|
|
394
|
+
&self,
|
|
395
|
+
path: &str,
|
|
396
|
+
bs: impl Into<Buffer>,
|
|
397
|
+
opts: options::WriteOptions,
|
|
398
|
+
) -> Result<Metadata> {
|
|
399
|
+
self.handle.block_on(self.op.write_options(path, bs, opts))
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/// Write multiple bytes into given path.
|
|
403
|
+
///
|
|
404
|
+
/// # Notes
|
|
405
|
+
///
|
|
406
|
+
/// - Write will make sure all bytes has been written, or an error will be returned.
|
|
407
|
+
///
|
|
408
|
+
/// # Examples
|
|
409
|
+
///
|
|
410
|
+
/// ```no_run
|
|
411
|
+
/// # use opendal::Result;
|
|
412
|
+
/// # use opendal::blocking;
|
|
413
|
+
/// # use opendal::blocking::Operator;
|
|
414
|
+
/// # use futures::StreamExt;
|
|
415
|
+
/// # use futures::SinkExt;
|
|
416
|
+
/// use bytes::Bytes;
|
|
417
|
+
///
|
|
418
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
419
|
+
/// let mut w = op.writer("path/to/file")?;
|
|
420
|
+
/// w.write(vec![0; 4096])?;
|
|
421
|
+
/// w.write(vec![1; 4096])?;
|
|
422
|
+
/// w.close()?;
|
|
423
|
+
/// # Ok(())
|
|
424
|
+
/// # }
|
|
425
|
+
/// ```
|
|
426
|
+
pub fn writer(&self, path: &str) -> Result<blocking::Writer> {
|
|
427
|
+
self.writer_options(path, options::WriteOptions::default())
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/// Create a new writer with extra options
|
|
431
|
+
pub fn writer_options(
|
|
432
|
+
&self,
|
|
433
|
+
path: &str,
|
|
434
|
+
opts: options::WriteOptions,
|
|
435
|
+
) -> Result<blocking::Writer> {
|
|
436
|
+
let w = self.handle.block_on(self.op.writer_options(path, opts))?;
|
|
437
|
+
Ok(blocking::Writer::new(self.handle.clone(), w))
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/// Copy a file from `from` to `to`.
|
|
441
|
+
///
|
|
442
|
+
/// # Notes
|
|
443
|
+
///
|
|
444
|
+
/// - `from` and `to` must be a file.
|
|
445
|
+
/// - `to` will be overwritten if it exists.
|
|
446
|
+
/// - If `from` and `to` are the same, nothing will happen.
|
|
447
|
+
/// - `copy` is idempotent. For same `from` and `to` input, the result will be the same.
|
|
448
|
+
///
|
|
449
|
+
/// # Examples
|
|
450
|
+
///
|
|
451
|
+
/// ```
|
|
452
|
+
/// # use opendal::Result;
|
|
453
|
+
/// use opendal::blocking;
|
|
454
|
+
/// # use opendal::blocking::Operator;
|
|
455
|
+
///
|
|
456
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
457
|
+
/// op.copy("path/to/file", "path/to/file2")?;
|
|
458
|
+
/// # Ok(())
|
|
459
|
+
/// # }
|
|
460
|
+
/// ```
|
|
461
|
+
pub fn copy(&self, from: &str, to: &str) -> Result<()> {
|
|
462
|
+
self.handle.block_on(self.op.copy(from, to))
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/// Rename a file from `from` to `to`.
|
|
466
|
+
///
|
|
467
|
+
/// # Notes
|
|
468
|
+
///
|
|
469
|
+
/// - `from` and `to` must be a file.
|
|
470
|
+
/// - `to` will be overwritten if it exists.
|
|
471
|
+
/// - If `from` and `to` are the same, a `IsSameFile` error will occur.
|
|
472
|
+
///
|
|
473
|
+
/// # Examples
|
|
474
|
+
///
|
|
475
|
+
/// ```
|
|
476
|
+
/// # use opendal::Result;
|
|
477
|
+
/// use opendal::blocking;
|
|
478
|
+
/// # use opendal::blocking::Operator;
|
|
479
|
+
///
|
|
480
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
481
|
+
/// op.rename("path/to/file", "path/to/file2")?;
|
|
482
|
+
/// # Ok(())
|
|
483
|
+
/// # }
|
|
484
|
+
/// ```
|
|
485
|
+
pub fn rename(&self, from: &str, to: &str) -> Result<()> {
|
|
486
|
+
self.handle.block_on(self.op.rename(from, to))
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/// Delete given path.
|
|
490
|
+
///
|
|
491
|
+
/// # Notes
|
|
492
|
+
///
|
|
493
|
+
/// - Delete not existing error won't return errors.
|
|
494
|
+
///
|
|
495
|
+
/// # Examples
|
|
496
|
+
///
|
|
497
|
+
/// ```no_run
|
|
498
|
+
/// # use anyhow::Result;
|
|
499
|
+
/// # use futures::io;
|
|
500
|
+
/// use opendal::blocking;
|
|
501
|
+
/// # use opendal::blocking::Operator;
|
|
502
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
503
|
+
/// op.delete("path/to/file")?;
|
|
504
|
+
/// # Ok(())
|
|
505
|
+
/// # }
|
|
506
|
+
/// ```
|
|
507
|
+
pub fn delete(&self, path: &str) -> Result<()> {
|
|
508
|
+
self.delete_options(path, options::DeleteOptions::default())
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/// Delete given path with options.
|
|
512
|
+
///
|
|
513
|
+
/// # Notes
|
|
514
|
+
///
|
|
515
|
+
/// - Delete not existing error won't return errors.
|
|
516
|
+
pub fn delete_options(&self, path: &str, opts: options::DeleteOptions) -> Result<()> {
|
|
517
|
+
self.handle.block_on(self.op.delete_options(path, opts))
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/// Delete an infallible iterator of paths.
|
|
521
|
+
///
|
|
522
|
+
/// Also see:
|
|
523
|
+
///
|
|
524
|
+
/// - [`blocking::Operator::delete_try_iter`]: delete an fallible iterator of paths.
|
|
525
|
+
pub fn delete_iter<I, D>(&self, iter: I) -> Result<()>
|
|
526
|
+
where
|
|
527
|
+
I: IntoIterator<Item = D>,
|
|
528
|
+
D: IntoDeleteInput,
|
|
529
|
+
{
|
|
530
|
+
self.handle.block_on(self.op.delete_iter(iter))
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/// Delete a fallible iterator of paths.
|
|
534
|
+
///
|
|
535
|
+
/// Also see:
|
|
536
|
+
///
|
|
537
|
+
/// - [`blocking::Operator::delete_iter`]: delete an infallible iterator of paths.
|
|
538
|
+
pub fn delete_try_iter<I, D>(&self, try_iter: I) -> Result<()>
|
|
539
|
+
where
|
|
540
|
+
I: IntoIterator<Item = Result<D>>,
|
|
541
|
+
D: IntoDeleteInput,
|
|
542
|
+
{
|
|
543
|
+
self.handle.block_on(self.op.delete_try_iter(try_iter))
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/// Create a [`BlockingDeleter`] to continuously remove content from storage.
|
|
547
|
+
///
|
|
548
|
+
/// It leverages batch deletion capabilities provided by storage services for efficient removal.
|
|
549
|
+
///
|
|
550
|
+
/// Users can have more control over the deletion process by using [`BlockingDeleter`] directly.
|
|
551
|
+
pub fn deleter(&self) -> Result<blocking::Deleter> {
|
|
552
|
+
blocking::Deleter::create(
|
|
553
|
+
self.handle.clone(),
|
|
554
|
+
self.handle.block_on(self.op.deleter())?,
|
|
555
|
+
)
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/// Remove the path and all nested dirs and files recursively.
|
|
559
|
+
///
|
|
560
|
+
/// # Notes
|
|
561
|
+
///
|
|
562
|
+
/// We don't support batch delete now.
|
|
563
|
+
///
|
|
564
|
+
/// # Examples
|
|
565
|
+
///
|
|
566
|
+
/// ```
|
|
567
|
+
/// # use anyhow::Result;
|
|
568
|
+
/// # use futures::io;
|
|
569
|
+
/// use opendal::blocking;
|
|
570
|
+
/// # use opendal::blocking::Operator;
|
|
571
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
572
|
+
/// op.remove_all("path/to/dir")?;
|
|
573
|
+
/// # Ok(())
|
|
574
|
+
/// # }
|
|
575
|
+
/// ```
|
|
576
|
+
pub fn remove_all(&self, path: &str) -> Result<()> {
|
|
577
|
+
self.handle.block_on(self.op.remove_all(path))
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/// List entries that starts with given `path` in parent dir.
|
|
581
|
+
///
|
|
582
|
+
/// # Notes
|
|
583
|
+
///
|
|
584
|
+
/// ## Recursively List
|
|
585
|
+
///
|
|
586
|
+
/// This function only read the children of the given directory. To read
|
|
587
|
+
/// all entries recursively, use `blocking::Operator::list_options("path", opts)`
|
|
588
|
+
/// instead.
|
|
589
|
+
///
|
|
590
|
+
/// ## Streaming List
|
|
591
|
+
///
|
|
592
|
+
/// This function will read all entries in the given directory. It could
|
|
593
|
+
/// take very long time and consume a lot of memory if the directory
|
|
594
|
+
/// contains a lot of entries.
|
|
595
|
+
///
|
|
596
|
+
/// In order to avoid this, you can use [`blocking::Operator::lister`] to list entries in
|
|
597
|
+
/// a streaming way.
|
|
598
|
+
///
|
|
599
|
+
/// # Examples
|
|
600
|
+
///
|
|
601
|
+
/// ```no_run
|
|
602
|
+
/// # use anyhow::Result;
|
|
603
|
+
/// use opendal::blocking;
|
|
604
|
+
/// use opendal::blocking::Operator;
|
|
605
|
+
/// use opendal::EntryMode;
|
|
606
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
607
|
+
/// let mut entries = op.list("path/to/dir/")?;
|
|
608
|
+
/// for entry in entries {
|
|
609
|
+
/// match entry.metadata().mode() {
|
|
610
|
+
/// EntryMode::FILE => {
|
|
611
|
+
/// println!("Handling file")
|
|
612
|
+
/// }
|
|
613
|
+
/// EntryMode::DIR => {
|
|
614
|
+
/// println!("Handling dir {}", entry.path())
|
|
615
|
+
/// }
|
|
616
|
+
/// EntryMode::Unknown => continue,
|
|
617
|
+
/// }
|
|
618
|
+
/// }
|
|
619
|
+
/// # Ok(())
|
|
620
|
+
/// # }
|
|
621
|
+
/// ```
|
|
622
|
+
pub fn list(&self, path: &str) -> Result<Vec<Entry>> {
|
|
623
|
+
self.list_options(path, options::ListOptions::default())
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
/// List entries that starts with given `path` in parent dir. with options.
|
|
627
|
+
///
|
|
628
|
+
/// # Notes
|
|
629
|
+
///
|
|
630
|
+
/// ## Streaming List
|
|
631
|
+
///
|
|
632
|
+
/// This function will read all entries in the given directory. It could
|
|
633
|
+
/// take very long time and consume a lot of memory if the directory
|
|
634
|
+
/// contains a lot of entries.
|
|
635
|
+
///
|
|
636
|
+
/// In order to avoid this, you can use [`blocking::Operator::lister`] to list entries in
|
|
637
|
+
/// a streaming way.
|
|
638
|
+
pub fn list_options(&self, path: &str, opts: options::ListOptions) -> Result<Vec<Entry>> {
|
|
639
|
+
self.handle.block_on(self.op.list_options(path, opts))
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/// List entries that starts with given `path` in parent dir.
|
|
643
|
+
///
|
|
644
|
+
/// This function will create a new [`BlockingLister`] to list entries. Users can stop listing
|
|
645
|
+
/// via dropping this [`Lister`].
|
|
646
|
+
///
|
|
647
|
+
/// # Notes
|
|
648
|
+
///
|
|
649
|
+
/// ## Recursively List
|
|
650
|
+
///
|
|
651
|
+
/// This function only read the children of the given directory. To read
|
|
652
|
+
/// all entries recursively, use [`blocking::Operator::lister_with`] and `delimiter("")`
|
|
653
|
+
/// instead.
|
|
654
|
+
///
|
|
655
|
+
/// # Examples
|
|
656
|
+
///
|
|
657
|
+
/// ```no_run
|
|
658
|
+
/// # use anyhow::Result;
|
|
659
|
+
/// # use futures::io;
|
|
660
|
+
/// use futures::TryStreamExt;
|
|
661
|
+
/// use opendal::blocking;
|
|
662
|
+
/// use opendal::blocking::Operator;
|
|
663
|
+
/// use opendal::EntryMode;
|
|
664
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
665
|
+
/// let mut ds = op.lister("path/to/dir/")?;
|
|
666
|
+
/// for de in ds {
|
|
667
|
+
/// let de = de?;
|
|
668
|
+
/// match de.metadata().mode() {
|
|
669
|
+
/// EntryMode::FILE => {
|
|
670
|
+
/// println!("Handling file")
|
|
671
|
+
/// }
|
|
672
|
+
/// EntryMode::DIR => {
|
|
673
|
+
/// println!("Handling dir like start a new list via meta.path()")
|
|
674
|
+
/// }
|
|
675
|
+
/// EntryMode::Unknown => continue,
|
|
676
|
+
/// }
|
|
677
|
+
/// }
|
|
678
|
+
/// # Ok(())
|
|
679
|
+
/// # }
|
|
680
|
+
/// ```
|
|
681
|
+
pub fn lister(&self, path: &str) -> Result<blocking::Lister> {
|
|
682
|
+
self.lister_options(path, options::ListOptions::default())
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
/// List entries within a given directory as an iterator with options.
|
|
686
|
+
///
|
|
687
|
+
/// This function will create a new handle to list entries.
|
|
688
|
+
///
|
|
689
|
+
/// An error will be returned if given path doesn't end with `/`.
|
|
690
|
+
pub fn lister_options(
|
|
691
|
+
&self,
|
|
692
|
+
path: &str,
|
|
693
|
+
opts: options::ListOptions,
|
|
694
|
+
) -> Result<blocking::Lister> {
|
|
695
|
+
let l = self.handle.block_on(self.op.lister_options(path, opts))?;
|
|
696
|
+
Ok(blocking::Lister::new(self.handle.clone(), l))
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/// Check if this operator can work correctly.
|
|
700
|
+
///
|
|
701
|
+
/// We will send a `list` request to path and return any errors we met.
|
|
702
|
+
///
|
|
703
|
+
/// ```
|
|
704
|
+
/// # use std::sync::Arc;
|
|
705
|
+
/// # use anyhow::Result;
|
|
706
|
+
/// use opendal::blocking;
|
|
707
|
+
/// use opendal::blocking::Operator;
|
|
708
|
+
/// use opendal::ErrorKind;
|
|
709
|
+
///
|
|
710
|
+
/// # fn test(op: blocking::Operator) -> Result<()> {
|
|
711
|
+
/// op.check()?;
|
|
712
|
+
/// # Ok(())
|
|
713
|
+
/// # }
|
|
714
|
+
/// ```
|
|
715
|
+
pub fn check(&self) -> Result<()> {
|
|
716
|
+
let mut ds = self.lister("/")?;
|
|
717
|
+
|
|
718
|
+
match ds.next() {
|
|
719
|
+
Some(Err(e)) if e.kind() != ErrorKind::NotFound => Err(e),
|
|
720
|
+
_ => Ok(()),
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
impl From<Operator> for AsyncOperator {
|
|
726
|
+
fn from(val: Operator) -> Self {
|
|
727
|
+
val.op
|
|
728
|
+
}
|
|
729
|
+
}
|