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,136 @@
|
|
|
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::io;
|
|
19
|
+
use std::pin::Pin;
|
|
20
|
+
use std::task::ready;
|
|
21
|
+
use std::task::Context;
|
|
22
|
+
use std::task::Poll;
|
|
23
|
+
|
|
24
|
+
use futures::AsyncWrite;
|
|
25
|
+
use futures::SinkExt;
|
|
26
|
+
|
|
27
|
+
use crate::raw::*;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
/// FuturesIoAsyncWriter is the adapter of [`AsyncWrite`] for [`Writer`].
|
|
31
|
+
///
|
|
32
|
+
/// Users can use this adapter in cases where they need to use [`AsyncWrite`] related trait.
|
|
33
|
+
///
|
|
34
|
+
/// FuturesIoAsyncWriter also implements [`Unpin`], [`Send`] and [`Sync`]
|
|
35
|
+
pub struct FuturesAsyncWriter {
|
|
36
|
+
sink: BufferSink,
|
|
37
|
+
buf: oio::FlexBuf,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
impl FuturesAsyncWriter {
|
|
41
|
+
/// NOTE: don't allow users to create directly.
|
|
42
|
+
#[inline]
|
|
43
|
+
pub(crate) fn new(w: WriteGenerator<oio::Writer>) -> Self {
|
|
44
|
+
FuturesAsyncWriter {
|
|
45
|
+
sink: BufferSink::new(w),
|
|
46
|
+
buf: oio::FlexBuf::new(256 * 1024),
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
impl AsyncWrite for FuturesAsyncWriter {
|
|
52
|
+
fn poll_write(
|
|
53
|
+
self: Pin<&mut Self>,
|
|
54
|
+
cx: &mut Context<'_>,
|
|
55
|
+
buf: &[u8],
|
|
56
|
+
) -> Poll<io::Result<usize>> {
|
|
57
|
+
let this = self.get_mut();
|
|
58
|
+
|
|
59
|
+
loop {
|
|
60
|
+
let n = this.buf.put(buf);
|
|
61
|
+
if n > 0 {
|
|
62
|
+
return Poll::Ready(Ok(n));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
ready!(this.sink.poll_ready_unpin(cx)).map_err(format_std_io_error)?;
|
|
66
|
+
|
|
67
|
+
let bs = this.buf.get().expect("frozen buffer must be valid");
|
|
68
|
+
this.sink
|
|
69
|
+
.start_send_unpin(Buffer::from(bs))
|
|
70
|
+
.map_err(format_std_io_error)?;
|
|
71
|
+
this.buf.clean();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
|
|
76
|
+
let this = self.get_mut();
|
|
77
|
+
|
|
78
|
+
loop {
|
|
79
|
+
// Make sure buf has been frozen.
|
|
80
|
+
this.buf.freeze();
|
|
81
|
+
let Some(bs) = this.buf.get() else {
|
|
82
|
+
return Poll::Ready(Ok(()));
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
ready!(this.sink.poll_ready_unpin(cx)).map_err(format_std_io_error)?;
|
|
86
|
+
this.sink
|
|
87
|
+
.start_send_unpin(Buffer::from(bs))
|
|
88
|
+
.map_err(format_std_io_error)?;
|
|
89
|
+
this.buf.clean();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
fn poll_close(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
|
|
94
|
+
let this = self.get_mut();
|
|
95
|
+
|
|
96
|
+
loop {
|
|
97
|
+
// Make sure buf has been frozen.
|
|
98
|
+
this.buf.freeze();
|
|
99
|
+
let Some(bs) = this.buf.get() else {
|
|
100
|
+
return this.sink.poll_close_unpin(cx).map_err(format_std_io_error);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
ready!(this.sink.poll_ready_unpin(cx)).map_err(format_std_io_error)?;
|
|
104
|
+
this.sink
|
|
105
|
+
.start_send_unpin(Buffer::from(bs))
|
|
106
|
+
.map_err(format_std_io_error)?;
|
|
107
|
+
this.buf.clean();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
#[cfg(test)]
|
|
113
|
+
mod tests {
|
|
114
|
+
use std::sync::Arc;
|
|
115
|
+
|
|
116
|
+
use super::*;
|
|
117
|
+
use crate::raw::MaybeSend;
|
|
118
|
+
|
|
119
|
+
#[tokio::test]
|
|
120
|
+
async fn test_trait() {
|
|
121
|
+
let op = Operator::via_iter(Scheme::Memory, []).unwrap();
|
|
122
|
+
|
|
123
|
+
let acc = op.into_inner();
|
|
124
|
+
let ctx = Arc::new(WriteContext::new(
|
|
125
|
+
acc,
|
|
126
|
+
"test".to_string(),
|
|
127
|
+
OpWrite::new(),
|
|
128
|
+
OpWriter::new().with_chunk(1),
|
|
129
|
+
));
|
|
130
|
+
let write_gen = WriteGenerator::create(ctx).await.unwrap();
|
|
131
|
+
|
|
132
|
+
let v = FuturesAsyncWriter::new(write_gen);
|
|
133
|
+
|
|
134
|
+
let _: Box<dyn Unpin + MaybeSend + Sync + 'static> = Box::new(v);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
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::pin::Pin;
|
|
19
|
+
use std::task::Context;
|
|
20
|
+
use std::task::Poll;
|
|
21
|
+
|
|
22
|
+
use bytes::Bytes;
|
|
23
|
+
use futures::SinkExt;
|
|
24
|
+
|
|
25
|
+
use crate::raw::*;
|
|
26
|
+
use crate::*;
|
|
27
|
+
|
|
28
|
+
/// FuturesBytesSink is the adapter of [`futures::Sink`] generated by [`Writer::into_bytes_sink`].
|
|
29
|
+
///
|
|
30
|
+
/// Users can use this adapter in cases where they need to use [`futures::Sink`] trait. FuturesBytesSink
|
|
31
|
+
/// reuses the same concurrent and chunk settings from [`Writer`].
|
|
32
|
+
///
|
|
33
|
+
/// FuturesBytesSink also implements [`Unpin`], [`Send`] and [`Sync`].
|
|
34
|
+
pub struct FuturesBytesSink {
|
|
35
|
+
sink: BufferSink,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
impl FuturesBytesSink {
|
|
39
|
+
/// Create a new sink from a [`oio::Writer`].
|
|
40
|
+
#[inline]
|
|
41
|
+
pub(crate) fn new(w: WriteGenerator<oio::Writer>) -> Self {
|
|
42
|
+
FuturesBytesSink {
|
|
43
|
+
sink: BufferSink::new(w),
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
impl futures::Sink<Bytes> for FuturesBytesSink {
|
|
49
|
+
type Error = std::io::Error;
|
|
50
|
+
|
|
51
|
+
fn poll_ready(
|
|
52
|
+
mut self: Pin<&mut Self>,
|
|
53
|
+
cx: &mut Context<'_>,
|
|
54
|
+
) -> Poll<Result<(), std::io::Error>> {
|
|
55
|
+
self.sink.poll_ready_unpin(cx).map_err(format_std_io_error)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fn start_send(mut self: Pin<&mut Self>, item: Bytes) -> Result<(), std::io::Error> {
|
|
59
|
+
self.sink
|
|
60
|
+
.start_send_unpin(Buffer::from(item))
|
|
61
|
+
.map_err(format_std_io_error)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
fn poll_flush(
|
|
65
|
+
mut self: Pin<&mut Self>,
|
|
66
|
+
cx: &mut Context<'_>,
|
|
67
|
+
) -> Poll<Result<(), std::io::Error>> {
|
|
68
|
+
self.sink.poll_flush_unpin(cx).map_err(format_std_io_error)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
fn poll_close(
|
|
72
|
+
mut self: Pin<&mut Self>,
|
|
73
|
+
cx: &mut Context<'_>,
|
|
74
|
+
) -> Poll<Result<(), std::io::Error>> {
|
|
75
|
+
self.sink.poll_close_unpin(cx).map_err(format_std_io_error)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#[cfg(test)]
|
|
80
|
+
mod tests {
|
|
81
|
+
use std::sync::Arc;
|
|
82
|
+
|
|
83
|
+
use super::*;
|
|
84
|
+
use crate::raw::MaybeSend;
|
|
85
|
+
|
|
86
|
+
#[tokio::test]
|
|
87
|
+
async fn test_trait() {
|
|
88
|
+
let op = Operator::via_iter(Scheme::Memory, []).unwrap();
|
|
89
|
+
|
|
90
|
+
let acc = op.into_inner();
|
|
91
|
+
let ctx = Arc::new(WriteContext::new(
|
|
92
|
+
acc,
|
|
93
|
+
"test".to_string(),
|
|
94
|
+
OpWrite::new(),
|
|
95
|
+
OpWriter::new().with_chunk(1),
|
|
96
|
+
));
|
|
97
|
+
let write_gen = WriteGenerator::create(ctx).await.unwrap();
|
|
98
|
+
|
|
99
|
+
let v = FuturesBytesSink::new(write_gen);
|
|
100
|
+
|
|
101
|
+
let _: Box<dyn Unpin + MaybeSend + Sync + 'static> = Box::new(v);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
mod writer;
|
|
19
|
+
pub use writer::Writer;
|
|
20
|
+
|
|
21
|
+
mod buffer_sink;
|
|
22
|
+
pub use buffer_sink::BufferSink;
|
|
23
|
+
mod futures_async_writer;
|
|
24
|
+
pub use futures_async_writer::FuturesAsyncWriter;
|
|
25
|
+
mod futures_bytes_sink;
|
|
26
|
+
pub use futures_bytes_sink::FuturesBytesSink;
|
|
@@ -0,0 +1,411 @@
|
|
|
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::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use bytes::Buf;
|
|
21
|
+
|
|
22
|
+
use crate::raw::*;
|
|
23
|
+
use crate::*;
|
|
24
|
+
|
|
25
|
+
/// Writer is designed to write data into given path in an asynchronous
|
|
26
|
+
/// manner.
|
|
27
|
+
///
|
|
28
|
+
/// ## Notes
|
|
29
|
+
///
|
|
30
|
+
/// Please make sure either `close` or `abort` has been called before
|
|
31
|
+
/// dropping the writer otherwise the data could be lost.
|
|
32
|
+
///
|
|
33
|
+
/// ## Usage
|
|
34
|
+
///
|
|
35
|
+
/// ### Write Multiple Chunks
|
|
36
|
+
///
|
|
37
|
+
/// Some services support to write multiple chunks of data into given path. Services that doesn't
|
|
38
|
+
/// support write multiple chunks will return [`ErrorKind::Unsupported`] error when calling `write`
|
|
39
|
+
/// at the second time.
|
|
40
|
+
///
|
|
41
|
+
/// ```
|
|
42
|
+
/// use opendal::Operator;
|
|
43
|
+
/// use opendal::Result;
|
|
44
|
+
///
|
|
45
|
+
/// async fn test(op: Operator) -> Result<()> {
|
|
46
|
+
/// let mut w = op.writer("path/to/file").await?;
|
|
47
|
+
/// w.write(vec![1; 1024]).await?;
|
|
48
|
+
/// w.write(vec![2; 1024]).await?;
|
|
49
|
+
/// w.close().await?;
|
|
50
|
+
/// Ok(())
|
|
51
|
+
/// }
|
|
52
|
+
/// ```
|
|
53
|
+
///
|
|
54
|
+
/// ### Write like `Sink`
|
|
55
|
+
///
|
|
56
|
+
/// ```
|
|
57
|
+
/// use anyhow::Result;
|
|
58
|
+
/// use futures::SinkExt;
|
|
59
|
+
/// use opendal::Operator;
|
|
60
|
+
///
|
|
61
|
+
/// async fn test(op: Operator) -> Result<()> {
|
|
62
|
+
/// let mut w = op.writer("path/to/file").await?.into_bytes_sink();
|
|
63
|
+
/// w.send(vec![1; 1024].into()).await?;
|
|
64
|
+
/// w.send(vec![2; 1024].into()).await?;
|
|
65
|
+
/// w.close().await?;
|
|
66
|
+
/// Ok(())
|
|
67
|
+
/// }
|
|
68
|
+
/// ```
|
|
69
|
+
///
|
|
70
|
+
/// ### Write like `AsyncWrite`
|
|
71
|
+
///
|
|
72
|
+
/// ```
|
|
73
|
+
/// use anyhow::Result;
|
|
74
|
+
/// use futures::AsyncWriteExt;
|
|
75
|
+
/// use opendal::Operator;
|
|
76
|
+
///
|
|
77
|
+
/// async fn test(op: Operator) -> Result<()> {
|
|
78
|
+
/// let mut w = op.writer("path/to/file").await?.into_futures_async_write();
|
|
79
|
+
/// w.write(&vec![1; 1024]).await?;
|
|
80
|
+
/// w.write(&vec![2; 1024]).await?;
|
|
81
|
+
/// w.close().await?;
|
|
82
|
+
/// Ok(())
|
|
83
|
+
/// }
|
|
84
|
+
/// ```
|
|
85
|
+
///
|
|
86
|
+
/// ### Write with append enabled
|
|
87
|
+
///
|
|
88
|
+
/// Writer also supports to write with append enabled. This is useful when users want to append
|
|
89
|
+
/// some data to the end of the file.
|
|
90
|
+
///
|
|
91
|
+
/// - If file doesn't exist, it will be created and just like calling `write`.
|
|
92
|
+
/// - If file exists, data will be appended to the end of the file.
|
|
93
|
+
///
|
|
94
|
+
/// Possible Errors:
|
|
95
|
+
///
|
|
96
|
+
/// - Some services store normal file and appendable file in different way. Trying to append
|
|
97
|
+
/// on non-appendable file could return [`ErrorKind::ConditionNotMatch`] error.
|
|
98
|
+
/// - Services that doesn't support append will return [`ErrorKind::Unsupported`] error when
|
|
99
|
+
/// creating writer with `append` enabled.
|
|
100
|
+
pub struct Writer {
|
|
101
|
+
/// Keep a reference to write context in writer.
|
|
102
|
+
_ctx: Arc<WriteContext>,
|
|
103
|
+
inner: WriteGenerator<oio::Writer>,
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
impl Writer {
|
|
107
|
+
/// Create a new writer from an `oio::Writer`.
|
|
108
|
+
pub(crate) async fn new(ctx: WriteContext) -> Result<Self> {
|
|
109
|
+
let ctx = Arc::new(ctx);
|
|
110
|
+
let inner = WriteGenerator::create(ctx.clone()).await?;
|
|
111
|
+
|
|
112
|
+
Ok(Self { _ctx: ctx, inner })
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// Write [`Buffer`] into writer.
|
|
116
|
+
///
|
|
117
|
+
/// This operation will write all data in given buffer into writer.
|
|
118
|
+
///
|
|
119
|
+
/// ## Examples
|
|
120
|
+
///
|
|
121
|
+
/// ```
|
|
122
|
+
/// use bytes::Bytes;
|
|
123
|
+
/// use opendal::Operator;
|
|
124
|
+
/// use opendal::Result;
|
|
125
|
+
///
|
|
126
|
+
/// async fn test(op: Operator) -> Result<()> {
|
|
127
|
+
/// let mut w = op.writer("hello.txt").await?;
|
|
128
|
+
/// // Buffer can be created from continues bytes.
|
|
129
|
+
/// w.write("hello, world").await?;
|
|
130
|
+
/// // Buffer can also be created from non-continues bytes.
|
|
131
|
+
/// w.write(vec![Bytes::from("hello,"), Bytes::from("world!")])
|
|
132
|
+
/// .await?;
|
|
133
|
+
///
|
|
134
|
+
/// // Make sure file has been written completely.
|
|
135
|
+
/// w.close().await?;
|
|
136
|
+
/// Ok(())
|
|
137
|
+
/// }
|
|
138
|
+
/// ```
|
|
139
|
+
pub async fn write(&mut self, bs: impl Into<Buffer>) -> Result<()> {
|
|
140
|
+
let mut bs = bs.into();
|
|
141
|
+
while !bs.is_empty() {
|
|
142
|
+
let n = self.inner.write(bs.clone()).await?;
|
|
143
|
+
bs.advance(n);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
Ok(())
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/// Write [`bytes::Buf`] into inner writer.
|
|
150
|
+
///
|
|
151
|
+
/// This operation will write all data in given buffer into writer.
|
|
152
|
+
///
|
|
153
|
+
/// # TODO
|
|
154
|
+
///
|
|
155
|
+
/// Optimize this function to avoid unnecessary copy.
|
|
156
|
+
pub async fn write_from(&mut self, bs: impl Buf) -> Result<()> {
|
|
157
|
+
let mut bs = bs;
|
|
158
|
+
let bs = Buffer::from(bs.copy_to_bytes(bs.remaining()));
|
|
159
|
+
self.write(bs).await
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/// Abort the writer and clean up all written data.
|
|
163
|
+
///
|
|
164
|
+
/// ## Notes
|
|
165
|
+
///
|
|
166
|
+
/// Abort should only be called when the writer is not closed or
|
|
167
|
+
/// aborted, otherwise an unexpected error could be returned.
|
|
168
|
+
pub async fn abort(&mut self) -> Result<()> {
|
|
169
|
+
self.inner.abort().await
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/// Close the writer and make sure all data have been committed.
|
|
173
|
+
///
|
|
174
|
+
/// ## Notes
|
|
175
|
+
///
|
|
176
|
+
/// Close should only be called when the writer is not closed or
|
|
177
|
+
/// aborted, otherwise an unexpected error could be returned.
|
|
178
|
+
pub async fn close(&mut self) -> Result<Metadata> {
|
|
179
|
+
self.inner.close().await
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/// Convert writer into [`BufferSink`] which implements [`Sink<Buffer>`].
|
|
183
|
+
///
|
|
184
|
+
/// # Notes
|
|
185
|
+
///
|
|
186
|
+
/// BufferSink is a zero-cost abstraction. The underlying writer
|
|
187
|
+
/// will reuse the Bytes and won't perform any copy operation over data.
|
|
188
|
+
///
|
|
189
|
+
/// # Examples
|
|
190
|
+
///
|
|
191
|
+
/// ## Basic Usage
|
|
192
|
+
///
|
|
193
|
+
/// ```
|
|
194
|
+
/// use std::io;
|
|
195
|
+
///
|
|
196
|
+
/// use bytes::Bytes;
|
|
197
|
+
/// use futures::SinkExt;
|
|
198
|
+
/// use opendal::Buffer;
|
|
199
|
+
/// use opendal::Operator;
|
|
200
|
+
/// use opendal::Result;
|
|
201
|
+
///
|
|
202
|
+
/// async fn test(op: Operator) -> io::Result<()> {
|
|
203
|
+
/// let mut s = op.writer("hello.txt").await?.into_sink();
|
|
204
|
+
/// let bs = "Hello, World!".as_bytes();
|
|
205
|
+
/// s.send(Buffer::from(bs)).await?;
|
|
206
|
+
/// s.close().await?;
|
|
207
|
+
///
|
|
208
|
+
/// Ok(())
|
|
209
|
+
/// }
|
|
210
|
+
/// ```
|
|
211
|
+
///
|
|
212
|
+
/// ## Concurrent Write
|
|
213
|
+
///
|
|
214
|
+
/// ```
|
|
215
|
+
/// use std::io;
|
|
216
|
+
///
|
|
217
|
+
/// use bytes::Bytes;
|
|
218
|
+
/// use futures::SinkExt;
|
|
219
|
+
/// use opendal::Buffer;
|
|
220
|
+
/// use opendal::Operator;
|
|
221
|
+
/// use opendal::Result;
|
|
222
|
+
///
|
|
223
|
+
/// async fn test(op: Operator) -> io::Result<()> {
|
|
224
|
+
/// let mut w = op
|
|
225
|
+
/// .writer_with("hello.txt")
|
|
226
|
+
/// .concurrent(8)
|
|
227
|
+
/// .chunk(256)
|
|
228
|
+
/// .await?
|
|
229
|
+
/// .into_sink();
|
|
230
|
+
/// let bs = "Hello, World!".as_bytes();
|
|
231
|
+
/// w.send(Buffer::from(bs)).await?;
|
|
232
|
+
/// w.close().await?;
|
|
233
|
+
///
|
|
234
|
+
/// Ok(())
|
|
235
|
+
/// }
|
|
236
|
+
/// ```
|
|
237
|
+
pub fn into_sink(self) -> BufferSink {
|
|
238
|
+
BufferSink::new(self.inner)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/// Convert writer into [`FuturesAsyncWriter`] which implements [`futures::AsyncWrite`],
|
|
242
|
+
///
|
|
243
|
+
/// # Notes
|
|
244
|
+
///
|
|
245
|
+
/// FuturesAsyncWriter is not a zero-cost abstraction. The underlying writer
|
|
246
|
+
/// requires an owned [`Buffer`], which involves an extra copy operation.
|
|
247
|
+
///
|
|
248
|
+
/// FuturesAsyncWriter is required to call `close()` to make sure all
|
|
249
|
+
/// data have been written to the storage.
|
|
250
|
+
///
|
|
251
|
+
/// # Examples
|
|
252
|
+
///
|
|
253
|
+
/// ## Basic Usage
|
|
254
|
+
///
|
|
255
|
+
/// ```
|
|
256
|
+
/// use std::io;
|
|
257
|
+
///
|
|
258
|
+
/// use futures::io::AsyncWriteExt;
|
|
259
|
+
/// use opendal::Operator;
|
|
260
|
+
/// use opendal::Result;
|
|
261
|
+
///
|
|
262
|
+
/// async fn test(op: Operator) -> io::Result<()> {
|
|
263
|
+
/// let mut w = op.writer("hello.txt").await?.into_futures_async_write();
|
|
264
|
+
/// let bs = "Hello, World!".as_bytes();
|
|
265
|
+
/// w.write_all(bs).await?;
|
|
266
|
+
/// w.close().await?;
|
|
267
|
+
///
|
|
268
|
+
/// Ok(())
|
|
269
|
+
/// }
|
|
270
|
+
/// ```
|
|
271
|
+
///
|
|
272
|
+
/// ## Concurrent Write
|
|
273
|
+
///
|
|
274
|
+
/// ```
|
|
275
|
+
/// use std::io;
|
|
276
|
+
///
|
|
277
|
+
/// use futures::io::AsyncWriteExt;
|
|
278
|
+
/// use opendal::Operator;
|
|
279
|
+
/// use opendal::Result;
|
|
280
|
+
///
|
|
281
|
+
/// async fn test(op: Operator) -> io::Result<()> {
|
|
282
|
+
/// let mut w = op
|
|
283
|
+
/// .writer_with("hello.txt")
|
|
284
|
+
/// .concurrent(8)
|
|
285
|
+
/// .chunk(256)
|
|
286
|
+
/// .await?
|
|
287
|
+
/// .into_futures_async_write();
|
|
288
|
+
/// let bs = "Hello, World!".as_bytes();
|
|
289
|
+
/// w.write_all(bs).await?;
|
|
290
|
+
/// w.close().await?;
|
|
291
|
+
///
|
|
292
|
+
/// Ok(())
|
|
293
|
+
/// }
|
|
294
|
+
/// ```
|
|
295
|
+
pub fn into_futures_async_write(self) -> FuturesAsyncWriter {
|
|
296
|
+
FuturesAsyncWriter::new(self.inner)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/// Convert writer into [`FuturesBytesSink`] which implements [`futures::Sink<Bytes>`].
|
|
300
|
+
///
|
|
301
|
+
/// # Notes
|
|
302
|
+
///
|
|
303
|
+
/// FuturesBytesSink is a zero-cost abstraction. The underlying writer
|
|
304
|
+
/// will reuse the Bytes and won't perform any copy operation.
|
|
305
|
+
///
|
|
306
|
+
/// # Examples
|
|
307
|
+
///
|
|
308
|
+
/// ## Basic Usage
|
|
309
|
+
///
|
|
310
|
+
/// ```
|
|
311
|
+
/// use std::io;
|
|
312
|
+
///
|
|
313
|
+
/// use bytes::Bytes;
|
|
314
|
+
/// use futures::SinkExt;
|
|
315
|
+
/// use opendal::Operator;
|
|
316
|
+
/// use opendal::Result;
|
|
317
|
+
///
|
|
318
|
+
/// async fn test(op: Operator) -> io::Result<()> {
|
|
319
|
+
/// let mut w = op.writer("hello.txt").await?.into_bytes_sink();
|
|
320
|
+
/// let bs = "Hello, World!".as_bytes();
|
|
321
|
+
/// w.send(Bytes::from(bs)).await?;
|
|
322
|
+
/// w.close().await?;
|
|
323
|
+
///
|
|
324
|
+
/// Ok(())
|
|
325
|
+
/// }
|
|
326
|
+
/// ```
|
|
327
|
+
///
|
|
328
|
+
/// ## Concurrent Write
|
|
329
|
+
///
|
|
330
|
+
/// ```
|
|
331
|
+
/// use std::io;
|
|
332
|
+
///
|
|
333
|
+
/// use bytes::Bytes;
|
|
334
|
+
/// use futures::SinkExt;
|
|
335
|
+
/// use opendal::Operator;
|
|
336
|
+
/// use opendal::Result;
|
|
337
|
+
///
|
|
338
|
+
/// async fn test(op: Operator) -> io::Result<()> {
|
|
339
|
+
/// let mut w = op
|
|
340
|
+
/// .writer_with("hello.txt")
|
|
341
|
+
/// .concurrent(8)
|
|
342
|
+
/// .chunk(256)
|
|
343
|
+
/// .await?
|
|
344
|
+
/// .into_bytes_sink();
|
|
345
|
+
/// let bs = "Hello, World!".as_bytes();
|
|
346
|
+
/// w.send(Bytes::from(bs)).await?;
|
|
347
|
+
/// w.close().await?;
|
|
348
|
+
///
|
|
349
|
+
/// Ok(())
|
|
350
|
+
/// }
|
|
351
|
+
/// ```
|
|
352
|
+
pub fn into_bytes_sink(self) -> FuturesBytesSink {
|
|
353
|
+
FuturesBytesSink::new(self.inner)
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
#[cfg(test)]
|
|
358
|
+
mod tests {
|
|
359
|
+
use bytes::Bytes;
|
|
360
|
+
use rand::rngs::ThreadRng;
|
|
361
|
+
use rand::Rng;
|
|
362
|
+
use rand::RngCore;
|
|
363
|
+
|
|
364
|
+
use crate::services;
|
|
365
|
+
use crate::Operator;
|
|
366
|
+
|
|
367
|
+
fn gen_random_bytes() -> Vec<u8> {
|
|
368
|
+
let mut rng = ThreadRng::default();
|
|
369
|
+
// Generate size between 1B..16MB.
|
|
370
|
+
let size = rng.gen_range(1..16 * 1024 * 1024);
|
|
371
|
+
let mut content = vec![0; size];
|
|
372
|
+
rng.fill_bytes(&mut content);
|
|
373
|
+
content
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
#[tokio::test]
|
|
377
|
+
async fn test_writer_write() {
|
|
378
|
+
let op = Operator::new(services::Memory::default()).unwrap().finish();
|
|
379
|
+
let path = "test_file";
|
|
380
|
+
|
|
381
|
+
let content = gen_random_bytes();
|
|
382
|
+
let mut writer = op.writer(path).await.unwrap();
|
|
383
|
+
writer
|
|
384
|
+
.write(content.clone())
|
|
385
|
+
.await
|
|
386
|
+
.expect("write must succeed");
|
|
387
|
+
writer.close().await.expect("close must succeed");
|
|
388
|
+
|
|
389
|
+
let buf = op.read(path).await.expect("read to end mut succeed");
|
|
390
|
+
|
|
391
|
+
assert_eq!(buf.to_bytes(), content);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
#[tokio::test]
|
|
395
|
+
async fn test_writer_write_from() {
|
|
396
|
+
let op = Operator::new(services::Memory::default()).unwrap().finish();
|
|
397
|
+
let path = "test_file";
|
|
398
|
+
|
|
399
|
+
let content = gen_random_bytes();
|
|
400
|
+
let mut writer = op.writer(path).await.unwrap();
|
|
401
|
+
writer
|
|
402
|
+
.write_from(Bytes::from(content.clone()))
|
|
403
|
+
.await
|
|
404
|
+
.expect("write must succeed");
|
|
405
|
+
writer.close().await.expect("close must succeed");
|
|
406
|
+
|
|
407
|
+
let buf = op.read(path).await.expect("read to end mut succeed");
|
|
408
|
+
|
|
409
|
+
assert_eq!(buf.to_bytes(), content);
|
|
410
|
+
}
|
|
411
|
+
}
|