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,570 @@
|
|
|
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
|
+
//! Errors that returned by OpenDAL
|
|
19
|
+
//!
|
|
20
|
+
//! # Examples
|
|
21
|
+
//!
|
|
22
|
+
//! ```
|
|
23
|
+
//! # use anyhow::Result;
|
|
24
|
+
//! # use opendal::EntryMode;
|
|
25
|
+
//! # use opendal::Operator;
|
|
26
|
+
//! use opendal::ErrorKind;
|
|
27
|
+
//! # async fn test(op: Operator) -> Result<()> {
|
|
28
|
+
//! if let Err(e) = op.stat("test_file").await {
|
|
29
|
+
//! if e.kind() == ErrorKind::NotFound {
|
|
30
|
+
//! println!("entry not exist")
|
|
31
|
+
//! }
|
|
32
|
+
//! }
|
|
33
|
+
//! # Ok(())
|
|
34
|
+
//! # }
|
|
35
|
+
//! ```
|
|
36
|
+
|
|
37
|
+
use std::backtrace::Backtrace;
|
|
38
|
+
use std::backtrace::BacktraceStatus;
|
|
39
|
+
use std::fmt;
|
|
40
|
+
use std::fmt::Debug;
|
|
41
|
+
use std::fmt::Display;
|
|
42
|
+
use std::fmt::Formatter;
|
|
43
|
+
use std::io;
|
|
44
|
+
|
|
45
|
+
/// Result that is a wrapper of `Result<T, opendal::Error>`
|
|
46
|
+
pub type Result<T, E = Error> = std::result::Result<T, E>;
|
|
47
|
+
|
|
48
|
+
/// ErrorKind is all kinds of Error of opendal.
|
|
49
|
+
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
|
50
|
+
#[non_exhaustive]
|
|
51
|
+
pub enum ErrorKind {
|
|
52
|
+
/// OpenDAL don't know what happened here, and no actions other than just
|
|
53
|
+
/// returning it back. For example, s3 returns an internal service error.
|
|
54
|
+
Unexpected,
|
|
55
|
+
/// Underlying service doesn't support this operation.
|
|
56
|
+
Unsupported,
|
|
57
|
+
|
|
58
|
+
/// The config for backend is invalid.
|
|
59
|
+
ConfigInvalid,
|
|
60
|
+
/// The given path is not found.
|
|
61
|
+
NotFound,
|
|
62
|
+
/// The given path doesn't have enough permission for this operation
|
|
63
|
+
PermissionDenied,
|
|
64
|
+
/// The given path is a directory.
|
|
65
|
+
IsADirectory,
|
|
66
|
+
/// The given path is not a directory.
|
|
67
|
+
NotADirectory,
|
|
68
|
+
/// The given path already exists thus we failed to the specified operation on it.
|
|
69
|
+
AlreadyExists,
|
|
70
|
+
/// Requests that sent to this path is over the limit, please slow down.
|
|
71
|
+
RateLimited,
|
|
72
|
+
/// The given file paths are same.
|
|
73
|
+
IsSameFile,
|
|
74
|
+
/// The condition of this operation is not match.
|
|
75
|
+
///
|
|
76
|
+
/// The `condition` itself is context based.
|
|
77
|
+
///
|
|
78
|
+
/// For example, in S3, the `condition` can be:
|
|
79
|
+
/// 1. writing a file with If-Match header but the file's ETag is not match (will get a 412 Precondition Failed).
|
|
80
|
+
/// 2. reading a file with If-None-Match header but the file's ETag is match (will get a 304 Not Modified).
|
|
81
|
+
///
|
|
82
|
+
/// As OpenDAL cannot handle the `condition not match` error, it will always return this error to users.
|
|
83
|
+
/// So users could to handle this error by themselves.
|
|
84
|
+
ConditionNotMatch,
|
|
85
|
+
/// The range of the content is not satisfied.
|
|
86
|
+
///
|
|
87
|
+
/// OpenDAL returns this error to indicate that the range of the read request is not satisfied.
|
|
88
|
+
RangeNotSatisfied,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
impl ErrorKind {
|
|
92
|
+
/// Convert self into static str.
|
|
93
|
+
pub fn into_static(self) -> &'static str {
|
|
94
|
+
self.into()
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// Capturing a backtrace can be a quite expensive runtime operation.
|
|
98
|
+
/// For some kinds of errors, backtrace is not useful and we can skip it (e.g., check if a file exists).
|
|
99
|
+
///
|
|
100
|
+
/// See <https://github.com/apache/opendal/discussions/5569>
|
|
101
|
+
fn enable_backtrace(&self) -> bool {
|
|
102
|
+
matches!(self, ErrorKind::Unexpected)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
impl Display for ErrorKind {
|
|
107
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
108
|
+
write!(f, "{}", self.into_static())
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
impl From<ErrorKind> for &'static str {
|
|
113
|
+
fn from(v: ErrorKind) -> &'static str {
|
|
114
|
+
match v {
|
|
115
|
+
ErrorKind::Unexpected => "Unexpected",
|
|
116
|
+
ErrorKind::Unsupported => "Unsupported",
|
|
117
|
+
ErrorKind::ConfigInvalid => "ConfigInvalid",
|
|
118
|
+
ErrorKind::NotFound => "NotFound",
|
|
119
|
+
ErrorKind::PermissionDenied => "PermissionDenied",
|
|
120
|
+
ErrorKind::IsADirectory => "IsADirectory",
|
|
121
|
+
ErrorKind::NotADirectory => "NotADirectory",
|
|
122
|
+
ErrorKind::AlreadyExists => "AlreadyExists",
|
|
123
|
+
ErrorKind::RateLimited => "RateLimited",
|
|
124
|
+
ErrorKind::IsSameFile => "IsSameFile",
|
|
125
|
+
ErrorKind::ConditionNotMatch => "ConditionNotMatch",
|
|
126
|
+
ErrorKind::RangeNotSatisfied => "RangeNotSatisfied",
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
132
|
+
enum ErrorStatus {
|
|
133
|
+
/// Permanent means without external changes, the error never changes.
|
|
134
|
+
///
|
|
135
|
+
/// For example, underlying services returns a not found error.
|
|
136
|
+
///
|
|
137
|
+
/// Users MUST never retry this operation.
|
|
138
|
+
Permanent,
|
|
139
|
+
/// Temporary means this error is returned for temporary.
|
|
140
|
+
///
|
|
141
|
+
/// For example, underlying services is rate limited or unavailable for temporary.
|
|
142
|
+
///
|
|
143
|
+
/// Users CAN retry the operation to resolve it.
|
|
144
|
+
Temporary,
|
|
145
|
+
/// Persistent means this error used to be temporary but still failed after retry.
|
|
146
|
+
///
|
|
147
|
+
/// For example, underlying services kept returning network errors.
|
|
148
|
+
///
|
|
149
|
+
/// Users SHOULD NOT retry this operation, since it's highly possible to error again.
|
|
150
|
+
Persistent,
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
impl Display for ErrorStatus {
|
|
154
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
155
|
+
match self {
|
|
156
|
+
ErrorStatus::Permanent => write!(f, "permanent"),
|
|
157
|
+
ErrorStatus::Temporary => write!(f, "temporary"),
|
|
158
|
+
ErrorStatus::Persistent => write!(f, "persistent"),
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// Error is the error struct returned by all opendal functions.
|
|
164
|
+
///
|
|
165
|
+
/// ## Display
|
|
166
|
+
///
|
|
167
|
+
/// Error can be displayed in two ways:
|
|
168
|
+
///
|
|
169
|
+
/// - Via `Display`: like `err.to_string()` or `format!("{err}")`
|
|
170
|
+
///
|
|
171
|
+
/// Error will be printed in a single line:
|
|
172
|
+
///
|
|
173
|
+
/// ```shell
|
|
174
|
+
/// Unexpected, context: { path: /path/to/file, called: send_async } => something wrong happened, source: networking error"
|
|
175
|
+
/// ```
|
|
176
|
+
///
|
|
177
|
+
/// - Via `Debug`: like `format!("{err:?}")`
|
|
178
|
+
///
|
|
179
|
+
/// Error will be printed in multi lines with more details and backtraces (if captured):
|
|
180
|
+
///
|
|
181
|
+
/// ```shell
|
|
182
|
+
/// Unexpected => something wrong happened
|
|
183
|
+
///
|
|
184
|
+
/// Context:
|
|
185
|
+
/// path: /path/to/file
|
|
186
|
+
/// called: send_async
|
|
187
|
+
///
|
|
188
|
+
/// Source: networking error
|
|
189
|
+
///
|
|
190
|
+
/// Backtrace:
|
|
191
|
+
/// 0: opendal::error::Error::new
|
|
192
|
+
/// at ./src/error.rs:197:24
|
|
193
|
+
/// 1: opendal::error::tests::generate_error
|
|
194
|
+
/// at ./src/error.rs:241:9
|
|
195
|
+
/// 2: opendal::error::tests::test_error_debug_with_backtrace::{{closure}}
|
|
196
|
+
/// at ./src/error.rs:305:41
|
|
197
|
+
/// ...
|
|
198
|
+
/// ```
|
|
199
|
+
///
|
|
200
|
+
/// - For conventional struct-style Debug representation, like `format!("{err:#?}")`:
|
|
201
|
+
///
|
|
202
|
+
/// ```shell
|
|
203
|
+
/// Error {
|
|
204
|
+
/// kind: Unexpected,
|
|
205
|
+
/// message: "something wrong happened",
|
|
206
|
+
/// status: Permanent,
|
|
207
|
+
/// operation: "Read",
|
|
208
|
+
/// context: [
|
|
209
|
+
/// (
|
|
210
|
+
/// "path",
|
|
211
|
+
/// "/path/to/file",
|
|
212
|
+
/// ),
|
|
213
|
+
/// (
|
|
214
|
+
/// "called",
|
|
215
|
+
/// "send_async",
|
|
216
|
+
/// ),
|
|
217
|
+
/// ],
|
|
218
|
+
/// source: Some(
|
|
219
|
+
/// "networking error",
|
|
220
|
+
/// ),
|
|
221
|
+
/// }
|
|
222
|
+
/// ```
|
|
223
|
+
pub struct Error {
|
|
224
|
+
kind: ErrorKind,
|
|
225
|
+
message: String,
|
|
226
|
+
|
|
227
|
+
status: ErrorStatus,
|
|
228
|
+
operation: &'static str,
|
|
229
|
+
context: Vec<(&'static str, String)>,
|
|
230
|
+
|
|
231
|
+
source: Option<anyhow::Error>,
|
|
232
|
+
backtrace: Option<Box<Backtrace>>,
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
impl Display for Error {
|
|
236
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
237
|
+
write!(f, "{} ({}) at {}", self.kind, self.status, self.operation)?;
|
|
238
|
+
|
|
239
|
+
if !self.context.is_empty() {
|
|
240
|
+
write!(f, ", context: {{ ")?;
|
|
241
|
+
write!(
|
|
242
|
+
f,
|
|
243
|
+
"{}",
|
|
244
|
+
self.context
|
|
245
|
+
.iter()
|
|
246
|
+
.map(|(k, v)| format!("{k}: {v}"))
|
|
247
|
+
.collect::<Vec<_>>()
|
|
248
|
+
.join(", ")
|
|
249
|
+
)?;
|
|
250
|
+
write!(f, " }}")?;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
if !self.message.is_empty() {
|
|
254
|
+
write!(f, " => {}", self.message)?;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
if let Some(source) = &self.source {
|
|
258
|
+
write!(f, ", source: {source}")?;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
Ok(())
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
impl Debug for Error {
|
|
266
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
267
|
+
// If alternate has been specified, we will print like Debug.
|
|
268
|
+
if f.alternate() {
|
|
269
|
+
let mut de = f.debug_struct("Error");
|
|
270
|
+
de.field("kind", &self.kind);
|
|
271
|
+
de.field("message", &self.message);
|
|
272
|
+
de.field("status", &self.status);
|
|
273
|
+
de.field("operation", &self.operation);
|
|
274
|
+
de.field("context", &self.context);
|
|
275
|
+
de.field("source", &self.source);
|
|
276
|
+
return de.finish();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
write!(f, "{} ({}) at {}", self.kind, self.status, self.operation)?;
|
|
280
|
+
if !self.message.is_empty() {
|
|
281
|
+
write!(f, " => {}", self.message)?;
|
|
282
|
+
}
|
|
283
|
+
writeln!(f)?;
|
|
284
|
+
|
|
285
|
+
if !self.context.is_empty() {
|
|
286
|
+
writeln!(f)?;
|
|
287
|
+
writeln!(f, "Context:")?;
|
|
288
|
+
for (k, v) in self.context.iter() {
|
|
289
|
+
writeln!(f, " {k}: {v}")?;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if let Some(source) = &self.source {
|
|
293
|
+
writeln!(f)?;
|
|
294
|
+
writeln!(f, "Source:")?;
|
|
295
|
+
writeln!(f, " {source:#}")?;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if let Some(backtrace) = &self.backtrace {
|
|
299
|
+
writeln!(f)?;
|
|
300
|
+
writeln!(f, "Backtrace:")?;
|
|
301
|
+
writeln!(f, "{backtrace}")?;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
Ok(())
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
impl std::error::Error for Error {
|
|
309
|
+
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
|
310
|
+
self.source.as_ref().map(|v| v.as_ref())
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
impl Error {
|
|
315
|
+
/// Create a new Error with error kind and message.
|
|
316
|
+
pub fn new(kind: ErrorKind, message: impl Into<String>) -> Self {
|
|
317
|
+
Self {
|
|
318
|
+
kind,
|
|
319
|
+
message: message.into(),
|
|
320
|
+
|
|
321
|
+
status: ErrorStatus::Permanent,
|
|
322
|
+
operation: "",
|
|
323
|
+
context: Vec::default(),
|
|
324
|
+
source: None,
|
|
325
|
+
|
|
326
|
+
backtrace: kind
|
|
327
|
+
.enable_backtrace()
|
|
328
|
+
// `Backtrace::capture()` will check if backtrace has
|
|
329
|
+
// been enabled internally. It's zero cost if backtrace
|
|
330
|
+
// is disabled.
|
|
331
|
+
.then(Backtrace::capture)
|
|
332
|
+
// We only keep captured backtrace to avoid an extra box.
|
|
333
|
+
.filter(|bt| bt.status() == BacktraceStatus::Captured)
|
|
334
|
+
.map(Box::new),
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/// Update error's operation.
|
|
339
|
+
///
|
|
340
|
+
/// # Notes
|
|
341
|
+
///
|
|
342
|
+
/// If the error already carries an operation, we will push a new context
|
|
343
|
+
/// `(called, operation)`.
|
|
344
|
+
pub fn with_operation(mut self, operation: impl Into<&'static str>) -> Self {
|
|
345
|
+
if !self.operation.is_empty() {
|
|
346
|
+
self.context.push(("called", self.operation.to_string()));
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
self.operation = operation.into();
|
|
350
|
+
self
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/// Add more context in error.
|
|
354
|
+
pub fn with_context(mut self, key: &'static str, value: impl ToString) -> Self {
|
|
355
|
+
self.context.push((key, value.to_string()));
|
|
356
|
+
self
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/// Set source for error.
|
|
360
|
+
///
|
|
361
|
+
/// # Notes
|
|
362
|
+
///
|
|
363
|
+
/// If the source has been set, we will raise a panic here.
|
|
364
|
+
pub fn set_source(mut self, src: impl Into<anyhow::Error>) -> Self {
|
|
365
|
+
debug_assert!(self.source.is_none(), "the source error has been set");
|
|
366
|
+
|
|
367
|
+
self.source = Some(src.into());
|
|
368
|
+
self
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/// Operate on error with map.
|
|
372
|
+
pub fn map<F>(self, f: F) -> Self
|
|
373
|
+
where
|
|
374
|
+
F: FnOnce(Self) -> Self,
|
|
375
|
+
{
|
|
376
|
+
f(self)
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/// Set permanent status for error.
|
|
380
|
+
///
|
|
381
|
+
/// By set permanent, we indicate the retry must be stopped.
|
|
382
|
+
pub fn set_permanent(mut self) -> Self {
|
|
383
|
+
self.status = ErrorStatus::Permanent;
|
|
384
|
+
self
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/// Set temporary status for error.
|
|
388
|
+
///
|
|
389
|
+
/// By set temporary, we indicate this error is retryable.
|
|
390
|
+
pub fn set_temporary(mut self) -> Self {
|
|
391
|
+
self.status = ErrorStatus::Temporary;
|
|
392
|
+
self
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/// Set persistent status for error.
|
|
396
|
+
///
|
|
397
|
+
/// By setting persistent, we indicate the retry should be stopped.
|
|
398
|
+
pub fn set_persistent(mut self) -> Self {
|
|
399
|
+
self.status = ErrorStatus::Persistent;
|
|
400
|
+
self
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/// Set permanent status for error by given permanent.
|
|
404
|
+
///
|
|
405
|
+
/// By set permanent, we indicate the retry must be stopped.
|
|
406
|
+
pub fn with_permanent(mut self, permanent: bool) -> Self {
|
|
407
|
+
if permanent {
|
|
408
|
+
self.status = ErrorStatus::Permanent;
|
|
409
|
+
}
|
|
410
|
+
self
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/// Set temporary status for error by given temporary.
|
|
414
|
+
///
|
|
415
|
+
/// By set temporary, we indicate this error is retryable.
|
|
416
|
+
pub fn with_temporary(mut self, temporary: bool) -> Self {
|
|
417
|
+
if temporary {
|
|
418
|
+
self.status = ErrorStatus::Temporary;
|
|
419
|
+
}
|
|
420
|
+
self
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/// Set persistent status for error by given persistent.
|
|
424
|
+
///
|
|
425
|
+
/// By set persistent, we indicate the retry should be stopped.
|
|
426
|
+
pub fn with_persistent(mut self, persistent: bool) -> Self {
|
|
427
|
+
if persistent {
|
|
428
|
+
self.status = ErrorStatus::Persistent;
|
|
429
|
+
}
|
|
430
|
+
self
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/// Return error's kind.
|
|
434
|
+
pub fn kind(&self) -> ErrorKind {
|
|
435
|
+
self.kind
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/// Check if this error is permanent.
|
|
439
|
+
pub fn is_permanent(&self) -> bool {
|
|
440
|
+
self.status == ErrorStatus::Permanent
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/// Check if this error is temporary.
|
|
444
|
+
pub fn is_temporary(&self) -> bool {
|
|
445
|
+
self.status == ErrorStatus::Temporary
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/// Check if this error is persistent.
|
|
449
|
+
pub fn is_persistent(&self) -> bool {
|
|
450
|
+
self.status == ErrorStatus::Persistent
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
/// Return error's backtrace.
|
|
454
|
+
///
|
|
455
|
+
/// Note: the standard way of exposing backtrace is the unstable feature [`error_generic_member_access`](https://github.com/rust-lang/rust/issues/99301).
|
|
456
|
+
/// We don't provide it as it requires nightly rust.
|
|
457
|
+
///
|
|
458
|
+
/// If you just want to print error with backtrace, use `Debug`, like `format!("{err:?}")`.
|
|
459
|
+
///
|
|
460
|
+
/// If you use nightly rust, and want to access `opendal::Error`'s backtrace in the standard way, you can
|
|
461
|
+
/// implement a newtype like this:
|
|
462
|
+
///
|
|
463
|
+
/// ```ignore
|
|
464
|
+
/// // assume you already have `#![feature(error_generic_member_access)]` on the top of your crate
|
|
465
|
+
///
|
|
466
|
+
/// #[derive(::std::fmt::Debug)]
|
|
467
|
+
/// pub struct OpendalError(opendal::Error);
|
|
468
|
+
///
|
|
469
|
+
/// impl std::fmt::Display for OpendalError {
|
|
470
|
+
/// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
471
|
+
/// self.0.fmt(f)
|
|
472
|
+
/// }
|
|
473
|
+
/// }
|
|
474
|
+
///
|
|
475
|
+
/// impl std::error::Error for OpendalError {
|
|
476
|
+
/// fn provide<'a>(&'a self, request: &mut std::error::Request<'a>) {
|
|
477
|
+
/// if let Some(bt) = self.0.backtrace() {
|
|
478
|
+
/// request.provide_ref::<std::backtrace::Backtrace>(bt);
|
|
479
|
+
/// }
|
|
480
|
+
/// }
|
|
481
|
+
///
|
|
482
|
+
/// fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
|
483
|
+
/// self.0.source()
|
|
484
|
+
/// }
|
|
485
|
+
/// }
|
|
486
|
+
/// ```
|
|
487
|
+
///
|
|
488
|
+
/// Additionally, you can add a clippy lint to prevent usage of the original `opendal::Error` type.
|
|
489
|
+
/// ```toml
|
|
490
|
+
/// disallowed-types = [
|
|
491
|
+
/// { path = "opendal::Error", reason = "Please use `my_crate::OpendalError` instead." },
|
|
492
|
+
/// ]
|
|
493
|
+
/// ```
|
|
494
|
+
pub fn backtrace(&self) -> Option<&Backtrace> {
|
|
495
|
+
self.backtrace.as_ref().map(|bt| bt.as_ref())
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
impl From<Error> for io::Error {
|
|
500
|
+
fn from(err: Error) -> Self {
|
|
501
|
+
let kind = match err.kind() {
|
|
502
|
+
ErrorKind::NotFound => io::ErrorKind::NotFound,
|
|
503
|
+
ErrorKind::PermissionDenied => io::ErrorKind::PermissionDenied,
|
|
504
|
+
_ => io::ErrorKind::Other,
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
io::Error::new(kind, err)
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
#[cfg(test)]
|
|
512
|
+
mod tests {
|
|
513
|
+
use std::mem::size_of;
|
|
514
|
+
use std::sync::LazyLock;
|
|
515
|
+
|
|
516
|
+
use anyhow::anyhow;
|
|
517
|
+
use pretty_assertions::assert_eq;
|
|
518
|
+
|
|
519
|
+
use super::*;
|
|
520
|
+
|
|
521
|
+
static TEST_ERROR: LazyLock<Error> = LazyLock::new(|| Error {
|
|
522
|
+
kind: ErrorKind::Unexpected,
|
|
523
|
+
message: "something wrong happened".to_string(),
|
|
524
|
+
status: ErrorStatus::Permanent,
|
|
525
|
+
operation: "Read",
|
|
526
|
+
context: vec![
|
|
527
|
+
("path", "/path/to/file".to_string()),
|
|
528
|
+
("called", "send_async".to_string()),
|
|
529
|
+
],
|
|
530
|
+
source: Some(anyhow!("networking error")),
|
|
531
|
+
backtrace: None,
|
|
532
|
+
});
|
|
533
|
+
|
|
534
|
+
/// This is not a real test case.
|
|
535
|
+
///
|
|
536
|
+
/// We assert our public structs here to make sure we don't introduce
|
|
537
|
+
/// unexpected struct/enum size change.
|
|
538
|
+
#[cfg(target_pointer_width = "64")]
|
|
539
|
+
#[test]
|
|
540
|
+
fn assert_size() {
|
|
541
|
+
assert_eq!(88, size_of::<Error>());
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
#[test]
|
|
545
|
+
fn test_error_display() {
|
|
546
|
+
let s = format!("{}", LazyLock::force(&TEST_ERROR));
|
|
547
|
+
assert_eq!(
|
|
548
|
+
s,
|
|
549
|
+
r#"Unexpected (permanent) at Read, context: { path: /path/to/file, called: send_async } => something wrong happened, source: networking error"#
|
|
550
|
+
);
|
|
551
|
+
println!("{:#?}", LazyLock::force(&TEST_ERROR));
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
#[test]
|
|
555
|
+
fn test_error_debug() {
|
|
556
|
+
let s = format!("{:?}", LazyLock::force(&TEST_ERROR));
|
|
557
|
+
assert_eq!(
|
|
558
|
+
s,
|
|
559
|
+
r#"Unexpected (permanent) at Read => something wrong happened
|
|
560
|
+
|
|
561
|
+
Context:
|
|
562
|
+
path: /path/to/file
|
|
563
|
+
called: send_async
|
|
564
|
+
|
|
565
|
+
Source:
|
|
566
|
+
networking error
|
|
567
|
+
"#
|
|
568
|
+
)
|
|
569
|
+
}
|
|
570
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
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::future::Future;
|
|
19
|
+
use std::pin::Pin;
|
|
20
|
+
use std::task::Context;
|
|
21
|
+
use std::task::Poll;
|
|
22
|
+
|
|
23
|
+
use futures::future::RemoteHandle;
|
|
24
|
+
use futures::FutureExt;
|
|
25
|
+
|
|
26
|
+
use crate::raw::BoxedStaticFuture;
|
|
27
|
+
|
|
28
|
+
/// Execute trait is used to execute task in background.
|
|
29
|
+
///
|
|
30
|
+
/// # Notes about Timeout Implementation
|
|
31
|
+
///
|
|
32
|
+
/// Implementing a correct and elegant timeout mechanism is challenging for us.
|
|
33
|
+
///
|
|
34
|
+
/// The `Execute` trait must be object safe, allowing us to use `Arc<dyn Execute>`. Consequently,
|
|
35
|
+
/// we cannot introduce a generic type parameter to `Execute`. We utilize [`RemoteHandle`] to
|
|
36
|
+
/// implement the [`Execute::execute`] method. [`RemoteHandle`] operates by transmitting
|
|
37
|
+
/// `Future::Output` through a channel, enabling the spawning of [`BoxedStaticFuture<()>`].
|
|
38
|
+
///
|
|
39
|
+
/// However, for timeouts, we need to spawn a future that resolves after a specified duration.
|
|
40
|
+
/// Simply wrapping the future within another timeout future is not feasible because if the timeout
|
|
41
|
+
/// is reached and the original future has not completed, it will be dropped—causing any held `Task`
|
|
42
|
+
/// to panic.
|
|
43
|
+
///
|
|
44
|
+
/// As an alternative solution, we developed a `timeout` API. Users of the `Executor` should invoke
|
|
45
|
+
/// this API when they require a timeout and combine it with their own futures using
|
|
46
|
+
/// [`futures::select`].
|
|
47
|
+
///
|
|
48
|
+
/// This approach may seem inelegant but it allows us flexibility without being tied specifically
|
|
49
|
+
/// to the Tokio runtime.
|
|
50
|
+
///
|
|
51
|
+
/// PLEASE raising an issue if you have a better solution.
|
|
52
|
+
pub trait Execute: Send + Sync + 'static {
|
|
53
|
+
/// Execute async task in background.
|
|
54
|
+
///
|
|
55
|
+
/// # Behavior
|
|
56
|
+
///
|
|
57
|
+
/// - Implementor MUST manage the executing futures and keep making progress.
|
|
58
|
+
/// - Implementor MUST NOT drop futures until it's resolved.
|
|
59
|
+
fn execute(&self, f: BoxedStaticFuture<()>);
|
|
60
|
+
|
|
61
|
+
/// Return a future that will be resolved after the given timeout.
|
|
62
|
+
///
|
|
63
|
+
/// Default implementation returns None.
|
|
64
|
+
fn timeout(&self) -> Option<BoxedStaticFuture<()>> {
|
|
65
|
+
None
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
impl Execute for () {
|
|
70
|
+
fn execute(&self, _: BoxedStaticFuture<()>) {
|
|
71
|
+
panic!("concurrent tasks executed with no executor has been enabled")
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// Task is generated by Executor that represents an executing task.
|
|
76
|
+
///
|
|
77
|
+
/// Users can fetch the results by calling `poll` or `.await` on this task.
|
|
78
|
+
/// Or, users can cancel the task by `drop` this task handle.
|
|
79
|
+
///
|
|
80
|
+
/// # Notes
|
|
81
|
+
///
|
|
82
|
+
/// Users don't need to call `poll` to make progress. All tasks are running in
|
|
83
|
+
/// the background.
|
|
84
|
+
pub struct Task<T> {
|
|
85
|
+
handle: RemoteHandle<T>,
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
impl<T: 'static> Task<T> {
|
|
89
|
+
/// Create a new task.
|
|
90
|
+
#[inline]
|
|
91
|
+
pub fn new(handle: RemoteHandle<T>) -> Self {
|
|
92
|
+
Self { handle }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// Replace the task with a new task.
|
|
96
|
+
///
|
|
97
|
+
/// The old task will be dropped directly.
|
|
98
|
+
#[inline]
|
|
99
|
+
pub fn replace(&mut self, new_task: Self) {
|
|
100
|
+
self.handle = new_task.handle;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
impl<T: 'static> Future for Task<T> {
|
|
105
|
+
type Output = T;
|
|
106
|
+
|
|
107
|
+
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
|
|
108
|
+
self.handle.poll_unpin(cx)
|
|
109
|
+
}
|
|
110
|
+
}
|