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,349 @@
|
|
|
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 std::fmt::Debug;
|
|
19
|
+
use std::pin::Pin;
|
|
20
|
+
use std::task::Context;
|
|
21
|
+
use std::task::Poll;
|
|
22
|
+
|
|
23
|
+
use futures::Stream;
|
|
24
|
+
use futures::StreamExt;
|
|
25
|
+
use tracing::span;
|
|
26
|
+
use tracing::Level;
|
|
27
|
+
use tracing::Span;
|
|
28
|
+
|
|
29
|
+
use crate::raw::*;
|
|
30
|
+
use crate::*;
|
|
31
|
+
|
|
32
|
+
/// Add [tracing](https://docs.rs/tracing/) for every operation.
|
|
33
|
+
///
|
|
34
|
+
/// # Examples
|
|
35
|
+
///
|
|
36
|
+
/// ## Basic Setup
|
|
37
|
+
///
|
|
38
|
+
/// ```no_run
|
|
39
|
+
/// # use opendal::layers::TracingLayer;
|
|
40
|
+
/// # use opendal::services;
|
|
41
|
+
/// # use opendal::Operator;
|
|
42
|
+
/// # use opendal::Result;
|
|
43
|
+
///
|
|
44
|
+
/// # fn main() -> Result<()> {
|
|
45
|
+
/// let _ = Operator::new(services::Memory::default())?
|
|
46
|
+
/// .layer(TracingLayer)
|
|
47
|
+
/// .finish();
|
|
48
|
+
/// Ok(())
|
|
49
|
+
/// # }
|
|
50
|
+
/// ```
|
|
51
|
+
///
|
|
52
|
+
/// ## Real usage
|
|
53
|
+
///
|
|
54
|
+
/// ```no_run
|
|
55
|
+
/// # use anyhow::Result;
|
|
56
|
+
/// # use opendal::layers::TracingLayer;
|
|
57
|
+
/// # use opendal::services;
|
|
58
|
+
/// # use opendal::Operator;
|
|
59
|
+
/// # use opentelemetry::KeyValue;
|
|
60
|
+
/// # use opentelemetry_sdk::trace;
|
|
61
|
+
/// # use opentelemetry_sdk::Resource;
|
|
62
|
+
/// # use tracing_subscriber::prelude::*;
|
|
63
|
+
/// # use tracing_subscriber::EnvFilter;
|
|
64
|
+
///
|
|
65
|
+
/// # fn main() -> Result<()> {
|
|
66
|
+
/// use opentelemetry::trace::TracerProvider;
|
|
67
|
+
/// let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder()
|
|
68
|
+
/// .with_simple_exporter(
|
|
69
|
+
/// opentelemetry_otlp::SpanExporter::builder()
|
|
70
|
+
/// .with_tonic()
|
|
71
|
+
/// .build()?,
|
|
72
|
+
/// )
|
|
73
|
+
/// .with_resource(
|
|
74
|
+
/// Resource::builder()
|
|
75
|
+
/// .with_attributes(vec![KeyValue::new("service.name", "opendal_example")])
|
|
76
|
+
/// .build(),
|
|
77
|
+
/// )
|
|
78
|
+
/// .build();
|
|
79
|
+
/// let tracer = tracer_provider.tracer("opendal_tracer");
|
|
80
|
+
/// let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer);
|
|
81
|
+
///
|
|
82
|
+
/// tracing_subscriber::registry()
|
|
83
|
+
/// .with(EnvFilter::from_default_env())
|
|
84
|
+
/// .with(opentelemetry)
|
|
85
|
+
/// .try_init()?;
|
|
86
|
+
///
|
|
87
|
+
/// {
|
|
88
|
+
/// let runtime = tokio::runtime::Runtime::new()?;
|
|
89
|
+
/// runtime.block_on(async {
|
|
90
|
+
/// let root = tracing::span!(tracing::Level::INFO, "app_start", work_units = 2);
|
|
91
|
+
/// let _enter = root.enter();
|
|
92
|
+
///
|
|
93
|
+
/// let _ = dotenvy::dotenv();
|
|
94
|
+
/// let op = Operator::new(services::Memory::default())?
|
|
95
|
+
/// .layer(TracingLayer)
|
|
96
|
+
/// .finish();
|
|
97
|
+
///
|
|
98
|
+
/// op.write("test", "0".repeat(16 * 1024 * 1024).into_bytes())
|
|
99
|
+
/// .await?;
|
|
100
|
+
/// op.stat("test").await?;
|
|
101
|
+
/// op.read("test").await?;
|
|
102
|
+
/// Ok::<(), opendal::Error>(())
|
|
103
|
+
/// })?;
|
|
104
|
+
/// }
|
|
105
|
+
///
|
|
106
|
+
/// // Shut down the current tracer provider.
|
|
107
|
+
/// // This will invoke the shutdown method on all span processors.
|
|
108
|
+
/// // span processors should export remaining spans before return.
|
|
109
|
+
/// tracer_provider.shutdown()?;
|
|
110
|
+
///
|
|
111
|
+
/// Ok(())
|
|
112
|
+
/// # }
|
|
113
|
+
/// ```
|
|
114
|
+
///
|
|
115
|
+
/// # Output
|
|
116
|
+
///
|
|
117
|
+
/// OpenDAL is using [`tracing`](https://docs.rs/tracing/latest/tracing/) for tracing internally.
|
|
118
|
+
///
|
|
119
|
+
/// To enable tracing output, please init one of the subscribers that `tracing` supports.
|
|
120
|
+
///
|
|
121
|
+
/// For example:
|
|
122
|
+
///
|
|
123
|
+
/// ```no_run
|
|
124
|
+
/// # use tracing::dispatcher;
|
|
125
|
+
/// # use tracing::Event;
|
|
126
|
+
/// # use tracing::Metadata;
|
|
127
|
+
/// # use tracing::span::Attributes;
|
|
128
|
+
/// # use tracing::span::Id;
|
|
129
|
+
/// # use tracing::span::Record;
|
|
130
|
+
/// # use tracing::subscriber::Subscriber;
|
|
131
|
+
///
|
|
132
|
+
/// # pub struct FooSubscriber;
|
|
133
|
+
/// # impl Subscriber for FooSubscriber {
|
|
134
|
+
/// # fn enabled(&self, _: &Metadata) -> bool { false }
|
|
135
|
+
/// # fn new_span(&self, _: &Attributes) -> Id { Id::from_u64(0) }
|
|
136
|
+
/// # fn record(&self, _: &Id, _: &Record) {}
|
|
137
|
+
/// # fn record_follows_from(&self, _: &Id, _: &Id) {}
|
|
138
|
+
/// # fn event(&self, _: &Event) {}
|
|
139
|
+
/// # fn enter(&self, _: &Id) {}
|
|
140
|
+
/// # fn exit(&self, _: &Id) {}
|
|
141
|
+
/// # }
|
|
142
|
+
/// # impl FooSubscriber { fn new() -> Self { FooSubscriber } }
|
|
143
|
+
///
|
|
144
|
+
/// let my_subscriber = FooSubscriber::new();
|
|
145
|
+
/// tracing::subscriber::set_global_default(my_subscriber).expect("setting tracing default failed");
|
|
146
|
+
/// ```
|
|
147
|
+
///
|
|
148
|
+
/// For real-world usage, please take a look at [`tracing-opentelemetry`](https://crates.io/crates/tracing-opentelemetry).
|
|
149
|
+
pub struct TracingLayer;
|
|
150
|
+
|
|
151
|
+
impl<A: Access> Layer<A> for TracingLayer {
|
|
152
|
+
type LayeredAccess = TracingAccessor<A>;
|
|
153
|
+
|
|
154
|
+
fn layer(&self, inner: A) -> Self::LayeredAccess {
|
|
155
|
+
let info = inner.info();
|
|
156
|
+
|
|
157
|
+
// Update http client with metrics http fetcher.
|
|
158
|
+
info.update_http_client(|client| {
|
|
159
|
+
HttpClient::with(TracingHttpFetcher {
|
|
160
|
+
inner: client.into_inner(),
|
|
161
|
+
})
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
TracingAccessor { inner }
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
pub struct TracingHttpFetcher {
|
|
169
|
+
inner: HttpFetcher,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
impl HttpFetch for TracingHttpFetcher {
|
|
173
|
+
async fn fetch(&self, req: http::Request<Buffer>) -> Result<http::Response<HttpBody>> {
|
|
174
|
+
let span = span!(Level::DEBUG, "http::fetch", ?req);
|
|
175
|
+
|
|
176
|
+
let resp = {
|
|
177
|
+
let _enter = span.enter();
|
|
178
|
+
self.inner.fetch(req).await?
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
let (parts, body) = resp.into_parts();
|
|
182
|
+
let body = body.map_inner(|s| Box::new(TracingStream { inner: s, span }));
|
|
183
|
+
Ok(http::Response::from_parts(parts, body))
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
pub struct TracingStream<S> {
|
|
188
|
+
inner: S,
|
|
189
|
+
span: Span,
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
impl<S> Stream for TracingStream<S>
|
|
193
|
+
where
|
|
194
|
+
S: Stream<Item = Result<Buffer>> + Unpin + 'static,
|
|
195
|
+
{
|
|
196
|
+
type Item = Result<Buffer>;
|
|
197
|
+
|
|
198
|
+
fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
|
|
199
|
+
let _enter = self.span.clone().entered();
|
|
200
|
+
self.inner.poll_next_unpin(cx)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
#[derive(Debug)]
|
|
205
|
+
pub struct TracingAccessor<A> {
|
|
206
|
+
inner: A,
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
impl<A: Access> LayeredAccess for TracingAccessor<A> {
|
|
210
|
+
type Inner = A;
|
|
211
|
+
type Reader = TracingWrapper<A::Reader>;
|
|
212
|
+
type Writer = TracingWrapper<A::Writer>;
|
|
213
|
+
type Lister = TracingWrapper<A::Lister>;
|
|
214
|
+
type Deleter = TracingWrapper<A::Deleter>;
|
|
215
|
+
|
|
216
|
+
fn inner(&self) -> &Self::Inner {
|
|
217
|
+
&self.inner
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#[tracing::instrument(level = "debug", skip(self))]
|
|
221
|
+
async fn create_dir(&self, path: &str, args: OpCreateDir) -> Result<RpCreateDir> {
|
|
222
|
+
self.inner.create_dir(path, args).await
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
226
|
+
let span = span!(Level::DEBUG, "read", path, ?args);
|
|
227
|
+
|
|
228
|
+
let (rp, r) = {
|
|
229
|
+
let _enter = span.enter();
|
|
230
|
+
self.inner.read(path, args).await?
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
Ok((rp, TracingWrapper::new(span, r)))
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
237
|
+
let span = span!(Level::DEBUG, "write", path, ?args);
|
|
238
|
+
|
|
239
|
+
let (rp, r) = {
|
|
240
|
+
let _enter = span.enter();
|
|
241
|
+
self.inner.write(path, args).await?
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
Ok((rp, TracingWrapper::new(span, r)))
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
#[tracing::instrument(level = "debug", skip(self))]
|
|
248
|
+
async fn copy(&self, from: &str, to: &str, args: OpCopy) -> Result<RpCopy> {
|
|
249
|
+
self.inner().copy(from, to, args).await
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
#[tracing::instrument(level = "debug", skip(self))]
|
|
253
|
+
async fn rename(&self, from: &str, to: &str, args: OpRename) -> Result<RpRename> {
|
|
254
|
+
self.inner().rename(from, to, args).await
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
#[tracing::instrument(level = "debug", skip(self))]
|
|
258
|
+
async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
|
|
259
|
+
self.inner.stat(path, args).await
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
263
|
+
let span = span!(Level::DEBUG, "delete");
|
|
264
|
+
|
|
265
|
+
let (rp, r) = {
|
|
266
|
+
let _enter = span.enter();
|
|
267
|
+
self.inner.delete().await?
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
Ok((rp, TracingWrapper::new(span, r)))
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
274
|
+
let span = span!(Level::DEBUG, "list", path, ?args);
|
|
275
|
+
|
|
276
|
+
let (rp, r) = {
|
|
277
|
+
let _enter = span.enter();
|
|
278
|
+
self.inner.list(path, args).await?
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
Ok((rp, TracingWrapper::new(span, r)))
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
#[tracing::instrument(level = "debug", skip(self))]
|
|
285
|
+
async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
|
|
286
|
+
self.inner.presign(path, args).await
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
pub struct TracingWrapper<R> {
|
|
291
|
+
span: Span,
|
|
292
|
+
inner: R,
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
impl<R> TracingWrapper<R> {
|
|
296
|
+
fn new(span: Span, inner: R) -> Self {
|
|
297
|
+
Self { span, inner }
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
impl<R: oio::Read> oio::Read for TracingWrapper<R> {
|
|
302
|
+
async fn read(&mut self) -> Result<Buffer> {
|
|
303
|
+
let _enter = self.span.enter();
|
|
304
|
+
|
|
305
|
+
self.inner.read().await
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
impl<R: oio::Write> oio::Write for TracingWrapper<R> {
|
|
310
|
+
async fn write(&mut self, bs: Buffer) -> Result<()> {
|
|
311
|
+
let _enter = self.span.enter();
|
|
312
|
+
|
|
313
|
+
self.inner.write(bs).await
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
async fn abort(&mut self) -> Result<()> {
|
|
317
|
+
let _enter = self.span.enter();
|
|
318
|
+
|
|
319
|
+
self.inner.abort().await
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
async fn close(&mut self) -> Result<Metadata> {
|
|
323
|
+
let _enter = self.span.enter();
|
|
324
|
+
|
|
325
|
+
self.inner.close().await
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
impl<R: oio::List> oio::List for TracingWrapper<R> {
|
|
330
|
+
async fn next(&mut self) -> Result<Option<oio::Entry>> {
|
|
331
|
+
let _enter = self.span.enter();
|
|
332
|
+
|
|
333
|
+
self.inner.next().await
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
impl<R: oio::Delete> oio::Delete for TracingWrapper<R> {
|
|
338
|
+
fn delete(&mut self, path: &str, args: OpDelete) -> Result<()> {
|
|
339
|
+
let _enter = self.span.enter();
|
|
340
|
+
|
|
341
|
+
self.inner.delete(path, args)
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
async fn flush(&mut self) -> Result<usize> {
|
|
345
|
+
let _enter = self.span.enter();
|
|
346
|
+
|
|
347
|
+
self.inner.flush().await
|
|
348
|
+
}
|
|
349
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
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 std::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
|
|
21
|
+
use crate::raw::*;
|
|
22
|
+
use crate::*;
|
|
23
|
+
|
|
24
|
+
/// TypeEraseLayer will erase the types on internal accessor.
|
|
25
|
+
///
|
|
26
|
+
/// For example, we will erase `Self::Reader` to `oio::Reader` (`Box<dyn oio::Read>`).
|
|
27
|
+
///
|
|
28
|
+
/// # Notes
|
|
29
|
+
///
|
|
30
|
+
/// TypeEraseLayer is not a public accessible layer that can be used by
|
|
31
|
+
/// external users. We use this layer to erase any generic types.
|
|
32
|
+
pub struct TypeEraseLayer;
|
|
33
|
+
|
|
34
|
+
impl<A: Access> Layer<A> for TypeEraseLayer {
|
|
35
|
+
type LayeredAccess = TypeEraseAccessor<A>;
|
|
36
|
+
|
|
37
|
+
fn layer(&self, inner: A) -> Self::LayeredAccess {
|
|
38
|
+
TypeEraseAccessor { inner }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// Provide reader wrapper for backend.
|
|
43
|
+
pub struct TypeEraseAccessor<A: Access> {
|
|
44
|
+
inner: A,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
impl<A: Access> Debug for TypeEraseAccessor<A> {
|
|
48
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
49
|
+
self.inner.fmt(f)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
impl<A: Access> LayeredAccess for TypeEraseAccessor<A> {
|
|
54
|
+
type Inner = A;
|
|
55
|
+
type Reader = oio::Reader;
|
|
56
|
+
type Writer = oio::Writer;
|
|
57
|
+
type Lister = oio::Lister;
|
|
58
|
+
type Deleter = oio::Deleter;
|
|
59
|
+
|
|
60
|
+
fn inner(&self) -> &Self::Inner {
|
|
61
|
+
&self.inner
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
65
|
+
self.inner
|
|
66
|
+
.read(path, args)
|
|
67
|
+
.await
|
|
68
|
+
.map(|(rp, r)| (rp, Box::new(r) as oio::Reader))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
72
|
+
self.inner
|
|
73
|
+
.write(path, args)
|
|
74
|
+
.await
|
|
75
|
+
.map(|(rp, w)| (rp, Box::new(w) as oio::Writer))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
79
|
+
self.inner
|
|
80
|
+
.delete()
|
|
81
|
+
.await
|
|
82
|
+
.map(|(rp, p)| (rp, Box::new(p) as oio::Deleter))
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
86
|
+
self.inner
|
|
87
|
+
.list(path, args)
|
|
88
|
+
.await
|
|
89
|
+
.map(|(rp, p)| (rp, Box::new(p) as oio::Lister))
|
|
90
|
+
}
|
|
91
|
+
}
|
data/core/src/lib.rs
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
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
|
+
#![doc(
|
|
19
|
+
html_logo_url = "https://raw.githubusercontent.com/apache/opendal/main/website/static/img/logo.svg"
|
|
20
|
+
)]
|
|
21
|
+
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
|
22
|
+
|
|
23
|
+
//! Apache OpenDAL™ is an Open Data Access Layer that enables seamless interaction with diverse storage services.
|
|
24
|
+
//!
|
|
25
|
+
//! OpenDAL's development is guided by its vision of **One Layer, All Storage** and its core principles: **Open Community**, **Solid Foundation**, **Fast Access**, **Object Storage First**, and **Extensible Architecture**. Read the explained vision at [OpenDAL Vision](https://opendal.apache.org/vision).
|
|
26
|
+
//!
|
|
27
|
+
//! # Quick Start
|
|
28
|
+
//!
|
|
29
|
+
//! OpenDAL's API entry points are [`Operator`] and [`blocking::Operator`]. All
|
|
30
|
+
//! public APIs are accessible through the operator. To utilize OpenDAL, you
|
|
31
|
+
//! need to:
|
|
32
|
+
//!
|
|
33
|
+
//! - [Init a service](#init-a-service)
|
|
34
|
+
//! - [Compose layers](#compose-layers)
|
|
35
|
+
//! - [Use operator](#use-operator)
|
|
36
|
+
//!
|
|
37
|
+
//! ## Init a service
|
|
38
|
+
//!
|
|
39
|
+
//! The first step is to pick a service and init it with a builder. All supported
|
|
40
|
+
//! services could be found at [`services`].
|
|
41
|
+
//!
|
|
42
|
+
//! Let's take [`services::S3`] as an example:
|
|
43
|
+
//!
|
|
44
|
+
//! ```no_run
|
|
45
|
+
//! use opendal::services;
|
|
46
|
+
//! use opendal::Operator;
|
|
47
|
+
//! use opendal::Result;
|
|
48
|
+
//!
|
|
49
|
+
//! fn main() -> Result<()> {
|
|
50
|
+
//! // Pick a builder and configure it.
|
|
51
|
+
//! let mut builder = services::S3::default().bucket("test");
|
|
52
|
+
//!
|
|
53
|
+
//! // Init an operator
|
|
54
|
+
//! let op = Operator::new(builder)?.finish();
|
|
55
|
+
//! Ok(())
|
|
56
|
+
//! }
|
|
57
|
+
//! ```
|
|
58
|
+
//!
|
|
59
|
+
//! ## Compose layers
|
|
60
|
+
//!
|
|
61
|
+
//! The next setup is to compose layers. Layers are modules that provide extra
|
|
62
|
+
//! features for every operation. All builtin layers could be found at [`layers`].
|
|
63
|
+
//!
|
|
64
|
+
//! Let's use [`layers::LoggingLayer`] as an example; this layer adds logging to
|
|
65
|
+
//! every operation that OpenDAL performs.
|
|
66
|
+
//!
|
|
67
|
+
//! ```no_run
|
|
68
|
+
//! use opendal::layers::LoggingLayer;
|
|
69
|
+
//! use opendal::services;
|
|
70
|
+
//! use opendal::Operator;
|
|
71
|
+
//! use opendal::Result;
|
|
72
|
+
//!
|
|
73
|
+
//! #[tokio::main]
|
|
74
|
+
//! async fn main() -> Result<()> {
|
|
75
|
+
//! // Pick a builder and configure it.
|
|
76
|
+
//! let mut builder = services::S3::default().bucket("test");
|
|
77
|
+
//!
|
|
78
|
+
//! // Init an operator
|
|
79
|
+
//! let op = Operator::new(builder)?
|
|
80
|
+
//! // Init with logging layer enabled.
|
|
81
|
+
//! .layer(LoggingLayer::default())
|
|
82
|
+
//! .finish();
|
|
83
|
+
//!
|
|
84
|
+
//! Ok(())
|
|
85
|
+
//! }
|
|
86
|
+
//! ```
|
|
87
|
+
//!
|
|
88
|
+
//! ## Use operator
|
|
89
|
+
//!
|
|
90
|
+
//! The final step is to use the operator. OpenDAL supports both async [`Operator`]
|
|
91
|
+
//! and blocking [`blocking::Operator`]. Please pick the one that fits your use case.
|
|
92
|
+
//!
|
|
93
|
+
//! Every Operator API follows a consistent pattern. For example, consider the `read` operation:
|
|
94
|
+
//!
|
|
95
|
+
//! - [`Operator::read`]: Executes a read operation.
|
|
96
|
+
//! - [`Operator::read_with`]: Executes a read operation with additional options using the builder pattern.
|
|
97
|
+
//! - [`Operator::read_options`]: Executes a read operation with extra options provided via a [`options::ReadOptions`] struct.
|
|
98
|
+
//! - [`Operator::reader`]: Creates a reader for streaming data, allowing for flexible access.
|
|
99
|
+
//! - [`Operator::reader_with`]: Creates a reader with advanced options using the builder pattern.
|
|
100
|
+
//! - [`Operator::reader_options`]: Creates a reader with extra options provided via a [`options::ReadOptions`] struct.
|
|
101
|
+
//!
|
|
102
|
+
//! The [`Reader`] created by [`Operator`] supports custom read control methods and can be converted
|
|
103
|
+
//! into [`futures::AsyncRead`] or [`futures::Stream`] for broader ecosystem compatibility.
|
|
104
|
+
//!
|
|
105
|
+
//! ```no_run
|
|
106
|
+
//! use opendal::layers::LoggingLayer;
|
|
107
|
+
//! use opendal::options;
|
|
108
|
+
//! use opendal::services;
|
|
109
|
+
//! use opendal::Operator;
|
|
110
|
+
//! use opendal::Result;
|
|
111
|
+
//!
|
|
112
|
+
//! #[tokio::main]
|
|
113
|
+
//! async fn main() -> Result<()> {
|
|
114
|
+
//! // Pick a builder and configure it.
|
|
115
|
+
//! let mut builder = services::S3::default().bucket("test");
|
|
116
|
+
//!
|
|
117
|
+
//! // Init an operator
|
|
118
|
+
//! let op = Operator::new(builder)?
|
|
119
|
+
//! // Init with logging layer enabled.
|
|
120
|
+
//! .layer(LoggingLayer::default())
|
|
121
|
+
//! .finish();
|
|
122
|
+
//!
|
|
123
|
+
//! // Fetch this file's metadata
|
|
124
|
+
//! let meta = op.stat("hello.txt").await?;
|
|
125
|
+
//! let length = meta.content_length();
|
|
126
|
+
//!
|
|
127
|
+
//! // Read data from `hello.txt` with options.
|
|
128
|
+
//! let bs = op
|
|
129
|
+
//! .read_with("hello.txt")
|
|
130
|
+
//! .range(0..8 * 1024 * 1024)
|
|
131
|
+
//! .chunk(1024 * 1024)
|
|
132
|
+
//! .concurrent(4)
|
|
133
|
+
//! .await?;
|
|
134
|
+
//!
|
|
135
|
+
//! // The same to:
|
|
136
|
+
//! let bs = op
|
|
137
|
+
//! .read_options("hello.txt", options::ReadOptions {
|
|
138
|
+
//! range: (0..8 * 1024 * 1024).into(),
|
|
139
|
+
//! chunk: Some(1024 * 1024),
|
|
140
|
+
//! concurrent: 4,
|
|
141
|
+
//! ..Default::default()
|
|
142
|
+
//! })
|
|
143
|
+
//! .await?;
|
|
144
|
+
//!
|
|
145
|
+
//! Ok(())
|
|
146
|
+
//! }
|
|
147
|
+
//! ```
|
|
148
|
+
//!
|
|
149
|
+
//! # Useful Links
|
|
150
|
+
//!
|
|
151
|
+
//! - [Concept][crate::docs::concepts]
|
|
152
|
+
//! - [Internals][crate::docs::internals]
|
|
153
|
+
//! - [Performance Guide][crate::docs::performance]
|
|
154
|
+
|
|
155
|
+
// Make sure all our public APIs have docs.
|
|
156
|
+
#![deny(missing_docs)]
|
|
157
|
+
|
|
158
|
+
// Private module with public types, they will be accessed via `opendal::Xxxx`
|
|
159
|
+
mod types;
|
|
160
|
+
pub use types::*;
|
|
161
|
+
|
|
162
|
+
// Public modules, they will be accessed like `opendal::layers::Xxxx`
|
|
163
|
+
#[cfg(feature = "blocking")]
|
|
164
|
+
pub mod blocking;
|
|
165
|
+
#[cfg(docsrs)]
|
|
166
|
+
pub mod docs;
|
|
167
|
+
pub mod layers;
|
|
168
|
+
pub mod raw;
|
|
169
|
+
pub mod services;
|
|
170
|
+
|
|
171
|
+
#[cfg(test)]
|
|
172
|
+
mod tests {
|
|
173
|
+
use std::mem::size_of;
|
|
174
|
+
|
|
175
|
+
use super::*;
|
|
176
|
+
/// This is not a real test case.
|
|
177
|
+
///
|
|
178
|
+
/// We assert our public structs here to make sure we don't introduce
|
|
179
|
+
/// unexpected struct/enum size change.
|
|
180
|
+
#[cfg(target_pointer_width = "64")]
|
|
181
|
+
#[test]
|
|
182
|
+
fn assert_size() {
|
|
183
|
+
assert_eq!(16, size_of::<Operator>());
|
|
184
|
+
assert_eq!(320, size_of::<Entry>());
|
|
185
|
+
assert_eq!(296, size_of::<Metadata>());
|
|
186
|
+
assert_eq!(1, size_of::<EntryMode>());
|
|
187
|
+
assert_eq!(24, size_of::<Scheme>());
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
trait AssertSendSync: Send + Sync {}
|
|
191
|
+
impl AssertSendSync for Entry {}
|
|
192
|
+
impl AssertSendSync for Capability {}
|
|
193
|
+
impl AssertSendSync for Error {}
|
|
194
|
+
impl AssertSendSync for Reader {}
|
|
195
|
+
impl AssertSendSync for Writer {}
|
|
196
|
+
impl AssertSendSync for Lister {}
|
|
197
|
+
impl AssertSendSync for Operator {}
|
|
198
|
+
|
|
199
|
+
/// This is used to make sure our public API implement Send + Sync
|
|
200
|
+
#[test]
|
|
201
|
+
fn test_trait() {
|
|
202
|
+
let _: Box<dyn AssertSendSync> = Box::new(Capability::default());
|
|
203
|
+
}
|
|
204
|
+
}
|