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,47 @@
|
|
|
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 http::StatusCode;
|
|
21
|
+
|
|
22
|
+
use super::core::OneDriveCore;
|
|
23
|
+
use super::error::parse_error;
|
|
24
|
+
use crate::raw::*;
|
|
25
|
+
use crate::*;
|
|
26
|
+
|
|
27
|
+
/// Delete operation
|
|
28
|
+
/// Documentation: https://learn.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_delete?view=odsp-graph-online
|
|
29
|
+
pub struct OneDriveDeleter {
|
|
30
|
+
core: Arc<OneDriveCore>,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
impl OneDriveDeleter {
|
|
34
|
+
pub fn new(core: Arc<OneDriveCore>) -> Self {
|
|
35
|
+
Self { core }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
impl oio::OneShotDelete for OneDriveDeleter {
|
|
40
|
+
async fn delete_once(&self, path: String, _: OpDelete) -> Result<()> {
|
|
41
|
+
let response = self.core.onedrive_delete(&path).await?;
|
|
42
|
+
match response.status() {
|
|
43
|
+
StatusCode::NO_CONTENT | StatusCode::NOT_FOUND => Ok(()),
|
|
44
|
+
_ => Err(parse_error(response)),
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [ ] append
|
|
9
|
+
- [x] create_dir
|
|
10
|
+
- [x] delete
|
|
11
|
+
- [x] copy
|
|
12
|
+
- [x] rename
|
|
13
|
+
- [x] list
|
|
14
|
+
- [ ] presign
|
|
15
|
+
- [ ] blocking
|
|
16
|
+
|
|
17
|
+
## Notes
|
|
18
|
+
|
|
19
|
+
Currently, OpenDAL supports OneDrive Personal only.
|
|
20
|
+
|
|
21
|
+
### Write Operations and OneDrive Behavior
|
|
22
|
+
|
|
23
|
+
For write-related operations, such as:
|
|
24
|
+
|
|
25
|
+
- write
|
|
26
|
+
- rename
|
|
27
|
+
- copy
|
|
28
|
+
- create_dir
|
|
29
|
+
|
|
30
|
+
OpenDAL's OneDrive service replaces the destination folder instead of rename it.
|
|
31
|
+
|
|
32
|
+
### Consistency Issues with Concurrent Requests
|
|
33
|
+
|
|
34
|
+
OneDrive does not guarantee consistency when handling a large number of concurrent requests write operations.
|
|
35
|
+
|
|
36
|
+
In some extreme cases, OneDrive may acknowledge an operation as successful but fail to commit the changes.
|
|
37
|
+
This inconsistency can cause subsequent operations to fail, returning errors like:
|
|
38
|
+
|
|
39
|
+
- 400 Bad Request: OneDrive considers folders in the path are not there yet
|
|
40
|
+
- 404 Not Found: OneDrive doesn't recognize the created folder
|
|
41
|
+
- 409 Conflict: OneDrive can't replace an existing folder
|
|
42
|
+
|
|
43
|
+
You should consider [`RetryLayer`] and monitor your operations carefully.
|
|
44
|
+
|
|
45
|
+
## Configuration
|
|
46
|
+
|
|
47
|
+
- `access_token`: Set a short-live access token for Microsoft Graph API (also, OneDrive API)
|
|
48
|
+
- `refresh_token`: Set a long term access token for Microsoft Graph API
|
|
49
|
+
- `client_id`: Set the client ID for a Microsoft Graph API application (available though Azure's registration portal)
|
|
50
|
+
- `client_secret`: Set the client secret for a Microsoft Graph API application
|
|
51
|
+
- `root`: Set the work directory for OneDrive backend
|
|
52
|
+
- `enable_versioning`: Enable versioning support for OneDrive items
|
|
53
|
+
|
|
54
|
+
The configuration for tokens is one of the following:
|
|
55
|
+
* `access_token` only, for short-lived access. Once the `access_token` expires, you must recreate the operator with a new token.
|
|
56
|
+
* `refresh_token`, `client_id`, and an optional `client_secret`, for long-lived access. The operator will automatically get and refresh the access token.
|
|
57
|
+
|
|
58
|
+
## How to get tokens
|
|
59
|
+
|
|
60
|
+
1. Create an application: navigate to [Microsoft Entra Admin Center](https://entra.microsoft.com/) -> Applications -> App Registrations -> New registration
|
|
61
|
+
2. In "Supported account types", choose "Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)"
|
|
62
|
+
3. Or in an existing application -> manifest, make sure `signInAudience` is `"AzureADandPersonalMicrosoftAccount"`. That's because we're calling Graph API with `/common` path segment.
|
|
63
|
+
4. The platform you choose determines whether you have to provide a `client_secret` or not. See [Public and confidential client apps](https://learn.microsoft.com/en-us/entra/identity-platform/msal-client-applications) for more information.
|
|
64
|
+
1. In short, if you choose "Mobile and desktop applications" or "Single-page application" (Public Client), you must not provide `client_secret`.
|
|
65
|
+
2. If you choose "Web" (Confidential Client), create a secret in "Certificates & secrets -> Client secrets -> New client secret", and provide it as `client_secret`.
|
|
66
|
+
5. Follow the [code grant flow](https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow) or other flows to get the access_token. The minimum scope is `Files.ReadWrite`. And make sure the access token represents a user, because it's accessing the user's onedrive by `/me/drive`. So "client credentials flow" won't work.
|
|
67
|
+
6. If you need `refresh_token` for long-lived access, add an additional `offline_access` scope.
|
|
68
|
+
|
|
69
|
+
Read more at [`OnedriveBuilder`].
|
|
70
|
+
|
|
71
|
+
## Example
|
|
72
|
+
|
|
73
|
+
### Via Builder
|
|
74
|
+
|
|
75
|
+
When you have a current access token:
|
|
76
|
+
|
|
77
|
+
```rust,no_run
|
|
78
|
+
use anyhow::Result;
|
|
79
|
+
use opendal::services::Onedrive;
|
|
80
|
+
use opendal::Operator;
|
|
81
|
+
|
|
82
|
+
#[tokio::main]
|
|
83
|
+
async fn main() -> Result<()> {
|
|
84
|
+
// create backend builder
|
|
85
|
+
let mut builder = Onedrive::default()
|
|
86
|
+
.access_token("my_access_token")
|
|
87
|
+
.root("/root/folder/for/operator");
|
|
88
|
+
|
|
89
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
90
|
+
Ok(())
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
When you have an Application with a refresh token:
|
|
95
|
+
|
|
96
|
+
```rust,no_run
|
|
97
|
+
use anyhow::Result;
|
|
98
|
+
use opendal::services::Onedrive;
|
|
99
|
+
use opendal::Operator;
|
|
100
|
+
|
|
101
|
+
#[tokio::main]
|
|
102
|
+
async fn main() -> Result<()> {
|
|
103
|
+
// create backend builder
|
|
104
|
+
let mut builder = Onedrive::default()
|
|
105
|
+
.refresh_token("my_refresh_token")
|
|
106
|
+
.client_id("my_client_id")
|
|
107
|
+
.root("/root/folder/for/operator");
|
|
108
|
+
|
|
109
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
110
|
+
Ok(())
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
[conflict-behavior]: https://learn.microsoft.com/en-us/graph/api/resources/driveitem?view=graph-rest-1.0#instance-attributes
|
|
@@ -0,0 +1,61 @@
|
|
|
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 http::Response;
|
|
19
|
+
use http::StatusCode;
|
|
20
|
+
|
|
21
|
+
use crate::raw::*;
|
|
22
|
+
use crate::*;
|
|
23
|
+
|
|
24
|
+
/// Parse error response into Error.
|
|
25
|
+
pub(super) fn parse_error(response: Response<Buffer>) -> Error {
|
|
26
|
+
let (parts, body) = response.into_parts();
|
|
27
|
+
let bs = body.to_bytes();
|
|
28
|
+
|
|
29
|
+
let (kind, retryable) = match parts.status {
|
|
30
|
+
StatusCode::NOT_FOUND => (ErrorKind::NotFound, false),
|
|
31
|
+
// The OneDrive service replaces resources.
|
|
32
|
+
// However, the Onedrive doesn't have Strong Read-After-Write properties,
|
|
33
|
+
// the concurrent requests to create directories might result in errors.
|
|
34
|
+
//
|
|
35
|
+
// Running behavior tests can yield HTTP 409 Conflict because of the consistency guarantee.
|
|
36
|
+
//
|
|
37
|
+
// Read more about `REPLACE_EXISTING_ITEM_WHEN_CONFLICT` in `graph_model.rs`.
|
|
38
|
+
StatusCode::CONFLICT => (ErrorKind::AlreadyExists, true),
|
|
39
|
+
StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
|
|
40
|
+
StatusCode::INTERNAL_SERVER_ERROR
|
|
41
|
+
| StatusCode::BAD_GATEWAY
|
|
42
|
+
| StatusCode::SERVICE_UNAVAILABLE
|
|
43
|
+
| StatusCode::GATEWAY_TIMEOUT => (ErrorKind::Unexpected, true),
|
|
44
|
+
StatusCode::NOT_MODIFIED | StatusCode::PRECONDITION_FAILED => {
|
|
45
|
+
(ErrorKind::ConditionNotMatch, false)
|
|
46
|
+
}
|
|
47
|
+
_ => (ErrorKind::Unexpected, false),
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
let message = String::from_utf8_lossy(&bs);
|
|
51
|
+
|
|
52
|
+
let mut err = Error::new(kind, message);
|
|
53
|
+
|
|
54
|
+
err = with_error_response_context(err, parts);
|
|
55
|
+
|
|
56
|
+
if retryable {
|
|
57
|
+
err = err.set_temporary();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
err
|
|
61
|
+
}
|
|
@@ -0,0 +1,425 @@
|
|
|
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 serde::Deserialize;
|
|
19
|
+
use serde::Serialize;
|
|
20
|
+
|
|
21
|
+
#[derive(Debug, Deserialize)]
|
|
22
|
+
pub struct GraphOAuthRefreshTokenResponseBody {
|
|
23
|
+
pub access_token: String,
|
|
24
|
+
pub refresh_token: String,
|
|
25
|
+
pub expires_in: i64, // in seconds
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// We `$select` some fields when sending GET requests.
|
|
29
|
+
/// Please keep [`OneDriveItem`] fields and this variable in sync.
|
|
30
|
+
/// Read more at https://learn.microsoft.com/en-us/graph/query-parameters?tabs=http#select-parameter
|
|
31
|
+
pub const GENERAL_SELECT_PARAM: &str =
|
|
32
|
+
"$select=id,name,lastModifiedDateTime,eTag,size,parentReference,folder,file";
|
|
33
|
+
|
|
34
|
+
/// We `$select` some fields when listing versions.
|
|
35
|
+
/// Please keep [`OneDriveItemVersion`] fields and this variable in sync.
|
|
36
|
+
/// Read more at https://learn.microsoft.com/en-us/graph/query-parameters?tabs=http#select-parameter
|
|
37
|
+
pub const VERSION_SELECT_PARAM: &str = "$select=id,size,lastModifiedDateTime";
|
|
38
|
+
|
|
39
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
40
|
+
pub struct GraphApiOneDriveListResponse {
|
|
41
|
+
#[serde(rename = "@odata.nextLink")]
|
|
42
|
+
pub next_link: Option<String>,
|
|
43
|
+
pub value: Vec<OneDriveItem>,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/// A `DriveItem`
|
|
47
|
+
/// read more at https://learn.microsoft.com/en-us/onedrive/developer/rest-api/resources/driveitem
|
|
48
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
49
|
+
#[serde(rename_all = "camelCase")]
|
|
50
|
+
pub struct OneDriveItem {
|
|
51
|
+
pub id: String,
|
|
52
|
+
pub name: String,
|
|
53
|
+
pub last_modified_date_time: String,
|
|
54
|
+
pub e_tag: String,
|
|
55
|
+
pub size: i64,
|
|
56
|
+
pub parent_reference: ParentReference,
|
|
57
|
+
#[serde(flatten)]
|
|
58
|
+
pub item_type: ItemType,
|
|
59
|
+
pub versions: Option<Vec<OneDriveItemVersion>>,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
63
|
+
#[serde(rename_all = "camelCase")]
|
|
64
|
+
pub struct ParentReference {
|
|
65
|
+
pub path: String,
|
|
66
|
+
pub drive_id: String,
|
|
67
|
+
pub id: String,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/// Additional properties when represents a facet of a "DriveItem":
|
|
71
|
+
/// - "file", read more at https://learn.microsoft.com/en-us/onedrive/developer/rest-api/resources/file
|
|
72
|
+
/// - "folder", read more at https://learn.microsoft.com/en-us/onedrive/developer/rest-api/resources/folder
|
|
73
|
+
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone)]
|
|
74
|
+
#[serde(untagged)]
|
|
75
|
+
pub enum ItemType {
|
|
76
|
+
Folder { folder: Folder },
|
|
77
|
+
File { file: File },
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
81
|
+
#[serde(rename_all = "camelCase")]
|
|
82
|
+
pub struct File {
|
|
83
|
+
mime_type: String,
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
87
|
+
#[serde(rename_all = "camelCase")]
|
|
88
|
+
pub struct Folder {
|
|
89
|
+
child_count: i32,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
93
|
+
pub struct GraphApiOneDriveVersionsResponse {
|
|
94
|
+
pub value: Vec<OneDriveItemVersion>,
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// A `driveItemVersion`
|
|
98
|
+
///
|
|
99
|
+
/// Read more at https://learn.microsoft.com/en-us/graph/api/resources/driveitemversion
|
|
100
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
101
|
+
#[serde(rename_all = "camelCase")]
|
|
102
|
+
pub struct OneDriveItemVersion {
|
|
103
|
+
pub id: String,
|
|
104
|
+
pub last_modified_date_time: String,
|
|
105
|
+
pub size: i64,
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Microsoft's documentation wants developers to set this as URL parameters. Some APIs use
|
|
109
|
+
// this as an data field in the payload.
|
|
110
|
+
pub const REPLACE_EXISTING_ITEM_WHEN_CONFLICT: &str = "replace";
|
|
111
|
+
|
|
112
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
113
|
+
pub struct CreateDirPayload {
|
|
114
|
+
#[serde(rename = "@microsoft.graph.conflictBehavior")]
|
|
115
|
+
conflict_behavior: String,
|
|
116
|
+
name: String,
|
|
117
|
+
folder: EmptyStruct,
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
impl CreateDirPayload {
|
|
121
|
+
pub fn new(name: String) -> Self {
|
|
122
|
+
Self {
|
|
123
|
+
conflict_behavior: REPLACE_EXISTING_ITEM_WHEN_CONFLICT.to_string(),
|
|
124
|
+
name,
|
|
125
|
+
folder: EmptyStruct {},
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
131
|
+
struct EmptyStruct {}
|
|
132
|
+
|
|
133
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
134
|
+
struct FileUploadItem {
|
|
135
|
+
#[serde(rename = "@microsoft.graph.conflictBehavior")]
|
|
136
|
+
conflict_behavior: String,
|
|
137
|
+
name: String,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
141
|
+
#[serde(rename_all = "camelCase")]
|
|
142
|
+
pub struct OneDriveUploadSessionCreationResponseBody {
|
|
143
|
+
pub upload_url: String,
|
|
144
|
+
pub expiration_date_time: String,
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
148
|
+
pub struct OneDriveUploadSessionCreationRequestBody {
|
|
149
|
+
item: FileUploadItem,
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
impl OneDriveUploadSessionCreationRequestBody {
|
|
153
|
+
pub fn new(path: String) -> Self {
|
|
154
|
+
OneDriveUploadSessionCreationRequestBody {
|
|
155
|
+
item: FileUploadItem {
|
|
156
|
+
conflict_behavior: REPLACE_EXISTING_ITEM_WHEN_CONFLICT.to_string(),
|
|
157
|
+
name: path,
|
|
158
|
+
},
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/// represents copy and rename (update) operations
|
|
164
|
+
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
165
|
+
#[serde(rename_all = "camelCase")]
|
|
166
|
+
pub struct OneDrivePatchRequestBody {
|
|
167
|
+
pub parent_reference: ParentReference,
|
|
168
|
+
pub name: String,
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
#[derive(Debug, Serialize, Deserialize)]
|
|
172
|
+
#[serde(rename_all = "camelCase")]
|
|
173
|
+
pub struct OneDriveMonitorStatus {
|
|
174
|
+
pub percentage_complete: f64, // useful for debugging
|
|
175
|
+
pub status: String,
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
#[cfg(test)]
|
|
179
|
+
mod tests {
|
|
180
|
+
use super::*;
|
|
181
|
+
|
|
182
|
+
#[test]
|
|
183
|
+
fn test_parse_one_drive_list_response_json() {
|
|
184
|
+
let data = r#"{
|
|
185
|
+
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('opendal@outlook.com')/drive/root/children(id,name,lastModifiedDateTime,eTag,size,parentReference,folder,file)",
|
|
186
|
+
"value": [
|
|
187
|
+
{
|
|
188
|
+
"@odata.etag": "\"{3B131E1C-7D81-20AF-80D0-450D00000000},10\"",
|
|
189
|
+
"eTag": "\"{3B131E1C-7D81-20AF-80D0-450D00000000},10\"",
|
|
190
|
+
"id": "A0AA0A000A000A0A!3397",
|
|
191
|
+
"lastModifiedDateTime": "2025-02-23T11:45:26Z",
|
|
192
|
+
"name": "empty_folder",
|
|
193
|
+
"size": 0,
|
|
194
|
+
"parentReference": {
|
|
195
|
+
"driveType": "personal",
|
|
196
|
+
"driveId": "A0AA0A000A000A0A",
|
|
197
|
+
"id": "A0AA0A000A000A0A!sea8cc6beffdb43d7976fbc7da445c639",
|
|
198
|
+
"name": "Documents",
|
|
199
|
+
"path": "/drive/root:",
|
|
200
|
+
"siteId": "5f1f11f3-a6b4-4414-aee0-215c774f80db"
|
|
201
|
+
},
|
|
202
|
+
"folder": {
|
|
203
|
+
"childCount": 0,
|
|
204
|
+
"view": {
|
|
205
|
+
"sortBy": "name",
|
|
206
|
+
"sortOrder": "ascending",
|
|
207
|
+
"viewType": "thumbnails"
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"@odata.etag": "\"{3B131E1C-7D81-20AF-80D0-710000000000},6\"",
|
|
213
|
+
"eTag": "\"{3B131E1C-7D81-20AF-80D0-710000000000},6\"",
|
|
214
|
+
"id": "A0AA0A000A000A0A!113",
|
|
215
|
+
"lastModifiedDateTime": "2025-02-16T19:48:39Z",
|
|
216
|
+
"name": "folder_a",
|
|
217
|
+
"size": 10560537,
|
|
218
|
+
"parentReference": {
|
|
219
|
+
"driveType": "personal",
|
|
220
|
+
"driveId": "A0AA0A000A000A0A",
|
|
221
|
+
"id": "A0AA0A000A000A0A!sea8cc6beffdb43d7976fbc7da445c639",
|
|
222
|
+
"name": "Documents",
|
|
223
|
+
"path": "/drive/root:",
|
|
224
|
+
"siteId": "5f1f11f3-a6b4-4414-aee0-215c774f80db"
|
|
225
|
+
},
|
|
226
|
+
"folder": {
|
|
227
|
+
"childCount": 5,
|
|
228
|
+
"view": {
|
|
229
|
+
"sortBy": "name",
|
|
230
|
+
"sortOrder": "ascending",
|
|
231
|
+
"viewType": "thumbnails"
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
}"#;
|
|
237
|
+
|
|
238
|
+
let response: GraphApiOneDriveListResponse = serde_json::from_str(data).unwrap();
|
|
239
|
+
assert_eq!(response.value.len(), 2);
|
|
240
|
+
let item = &response.value[0];
|
|
241
|
+
assert_eq!(item.name, "empty_folder");
|
|
242
|
+
assert_eq!(item.last_modified_date_time, "2025-02-23T11:45:26Z");
|
|
243
|
+
assert_eq!(item.e_tag, "\"{3B131E1C-7D81-20AF-80D0-450D00000000},10\"");
|
|
244
|
+
assert_eq!(item.size, 0);
|
|
245
|
+
assert_eq!(item.parent_reference.path, "/drive/root:");
|
|
246
|
+
if let ItemType::Folder { folder, .. } = &item.item_type {
|
|
247
|
+
assert_eq!(folder.child_count, 0);
|
|
248
|
+
} else {
|
|
249
|
+
panic!("item_type is not a folder");
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
#[test]
|
|
254
|
+
fn test_parse_one_drive_list_response_with_next_link_json() {
|
|
255
|
+
let response_json = r#"{
|
|
256
|
+
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('opendal@outlook.com')/drive/root/children(id,name,lastModifiedDateTime,eTag,size,parentReference,folder,file)",
|
|
257
|
+
"@odata.nextLink": "https://graph.microsoft.com/v1.0/me/drive/root/children?$select=id%2cname%2clastModifiedDateTime%2ceTag%2csize%2cparentReference%2cfolder%2cfile&$top=2&$skiptoken=UGFnZWQ9VFJVRSZwX1NvcnRCZWhhdmlvcj0xJnBfRmlsZUxlYWZSZWY9Zm9sZGVyX2EmcF9JRD03MDAz",
|
|
258
|
+
"value": [
|
|
259
|
+
{
|
|
260
|
+
"@odata.etag": "\"{3B131E1C-7D81-20AF-80D0-450D00000000},10\"",
|
|
261
|
+
"eTag": "\"{3B131E1C-7D81-20AF-80D0-450D00000000},10\"",
|
|
262
|
+
"id": "A0AA0A000A000A0A!3397",
|
|
263
|
+
"lastModifiedDateTime": "2025-02-23T11:45:26Z",
|
|
264
|
+
"name": "empty_folder",
|
|
265
|
+
"size": 0,
|
|
266
|
+
"parentReference": {
|
|
267
|
+
"driveType": "personal",
|
|
268
|
+
"driveId": "A0AA0A000A000A0A",
|
|
269
|
+
"id": "A0AA0A000A000A0A!sea8cc6beffdb43d7976fbc7da445c639",
|
|
270
|
+
"name": "Documents",
|
|
271
|
+
"path": "/drive/root:",
|
|
272
|
+
"siteId": "5f1f11f3-a6b4-4414-aee0-215c774f80db"
|
|
273
|
+
},
|
|
274
|
+
"folder": {
|
|
275
|
+
"childCount": 0,
|
|
276
|
+
"view": {
|
|
277
|
+
"sortBy": "name",
|
|
278
|
+
"sortOrder": "ascending",
|
|
279
|
+
"viewType": "thumbnails"
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
]
|
|
284
|
+
}"#;
|
|
285
|
+
|
|
286
|
+
let response: GraphApiOneDriveListResponse = serde_json::from_str(response_json).unwrap();
|
|
287
|
+
assert_eq!(response.value.len(), 1);
|
|
288
|
+
let item = &response.value[0];
|
|
289
|
+
if let ItemType::Folder { folder, .. } = &item.item_type {
|
|
290
|
+
assert_eq!(folder.child_count, 0);
|
|
291
|
+
} else {
|
|
292
|
+
panic!("item_type is not a folder");
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
#[test]
|
|
297
|
+
fn test_parse_one_drive_file_json() {
|
|
298
|
+
let data = r#"{
|
|
299
|
+
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('opendal%40outlook.com')/drive/root(id,name,lastModifiedDateTime,eTag,size,parentReference,folder,file)/$entity",
|
|
300
|
+
"@odata.etag": "\"{3B131E1C-7D81-20AF-80D0-720000000000},2\"",
|
|
301
|
+
"eTag": "\"{3B131E1C-7D81-20AF-80D0-720000000000},2\"",
|
|
302
|
+
"id": "A0AA0A000A000A0A!114",
|
|
303
|
+
"lastModifiedDateTime": "2025-02-16T19:49:05Z",
|
|
304
|
+
"name": "filename.txt",
|
|
305
|
+
"size": 3,
|
|
306
|
+
"parentReference": {
|
|
307
|
+
"driveType": "personal",
|
|
308
|
+
"driveId": "A0AA0A000A000A0A",
|
|
309
|
+
"id": "A0AA0A000A000A0A!113",
|
|
310
|
+
"name": "folder_a",
|
|
311
|
+
"path": "/drive/root:/folder_a",
|
|
312
|
+
"siteId": "5f1f11f3-a6b4-4414-aee0-215c774f80db"
|
|
313
|
+
},
|
|
314
|
+
"file": {
|
|
315
|
+
"mimeType": "text/plain",
|
|
316
|
+
"hashes": {
|
|
317
|
+
"quickXorHash": "79jFLwAAAAAAAAAAAwAAAAAAAAA=",
|
|
318
|
+
"sha1Hash": "57218C316B6921E2CD61027A2387EDC31A2D9471",
|
|
319
|
+
"sha256Hash": "F1945CD6C19E56B3C1C78943EF5EC18116907A4CA1EFC40A57D48AB1DB7ADFC5"
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}"#;
|
|
323
|
+
|
|
324
|
+
let item: OneDriveItem = serde_json::from_str(data).unwrap();
|
|
325
|
+
assert_eq!(item.name, "filename.txt");
|
|
326
|
+
assert_eq!(item.last_modified_date_time, "2025-02-16T19:49:05Z");
|
|
327
|
+
assert_eq!(item.e_tag, "\"{3B131E1C-7D81-20AF-80D0-720000000000},2\"");
|
|
328
|
+
assert_eq!(item.size, 3);
|
|
329
|
+
assert_eq!(item.parent_reference.id, "A0AA0A000A000A0A!113");
|
|
330
|
+
assert!(item.versions.is_none());
|
|
331
|
+
if let ItemType::File { file, .. } = &item.item_type {
|
|
332
|
+
assert_eq!(file.mime_type, "text/plain");
|
|
333
|
+
} else {
|
|
334
|
+
panic!("item_type is not a file");
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
#[test]
|
|
339
|
+
fn test_parse_one_drive_file_with_version_json() {
|
|
340
|
+
let data = r#"{
|
|
341
|
+
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('opendal%40outlook.com')/drive/root(id,name,lastModifiedDateTime,eTag,size,parentReference,folder,file)/$entity",
|
|
342
|
+
"@odata.etag": "\"{3B131E1C-7D81-20AF-80D0-720000000000},2\"",
|
|
343
|
+
"eTag": "\"{3B131E1C-7D81-20AF-80D0-720000000000},2\"",
|
|
344
|
+
"id": "A0AA0A000A000A0A!114",
|
|
345
|
+
"lastModifiedDateTime": "2025-02-16T19:49:05Z",
|
|
346
|
+
"name": "filename.txt",
|
|
347
|
+
"size": 3,
|
|
348
|
+
"parentReference": {
|
|
349
|
+
"driveType": "personal",
|
|
350
|
+
"driveId": "A0AA0A000A000A0A",
|
|
351
|
+
"id": "A0AA0A000A000A0A!113",
|
|
352
|
+
"name": "folder_a",
|
|
353
|
+
"path": "/drive/root:/folder_a",
|
|
354
|
+
"siteId": "5f1f11f3-a6b4-4414-aee0-215c774f80db"
|
|
355
|
+
},
|
|
356
|
+
"file": {
|
|
357
|
+
"mimeType": "text/plain",
|
|
358
|
+
"hashes": {
|
|
359
|
+
"quickXorHash": "79jFLwAAAAAAAAAAAwAAAAAAAAA=",
|
|
360
|
+
"sha1Hash": "57218C316B6921E2CD61027A2387EDC31A2D9471",
|
|
361
|
+
"sha256Hash": "F1945CD6C19E56B3C1C78943EF5EC18116907A4CA1EFC40A57D48AB1DB7ADFC5"
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"versions@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('opendal%40outlook.com')/drive/root/versions",
|
|
365
|
+
"versions": [
|
|
366
|
+
{
|
|
367
|
+
"@microsoft.graph.downloadUrl": "https://my.microsoftpersonalcontent.com/personal/A0AA0A000A000A0A/_layouts/15/download.aspx?UniqueId=3b131e1c-7d81-20af-80d0-720000000000&Translate=false&tempauth=v1e.a&ApiVersion=2.0",
|
|
368
|
+
"id": "1.0",
|
|
369
|
+
"lastModifiedDateTime": "2025-02-16T19:49:05Z",
|
|
370
|
+
"size": 3,
|
|
371
|
+
"lastModifiedBy": {
|
|
372
|
+
"user": {
|
|
373
|
+
"email": "erickgdev@outlook.com",
|
|
374
|
+
"displayName": "erickgdev@outlook.com"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
]
|
|
379
|
+
}"#;
|
|
380
|
+
|
|
381
|
+
let item: OneDriveItem = serde_json::from_str(data).unwrap();
|
|
382
|
+
let versions = item.versions.expect("Versions present");
|
|
383
|
+
assert_eq!("1.0", versions[0].id);
|
|
384
|
+
assert_eq!("2025-02-16T19:49:05Z", versions[0].last_modified_date_time);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
#[test]
|
|
388
|
+
fn test_parse_one_drive_monitor_status_json() {
|
|
389
|
+
let data = r#"{
|
|
390
|
+
"@odata.context": "https://my.microsoftpersonalcontent.com/personal/A0AA0A000A000A0A/_api/v2.0/$metadata#oneDrive.asynchronousOperationStatus",
|
|
391
|
+
"percentageComplete": 100.0,
|
|
392
|
+
"resourceId": "01JP3NYHGSBJ7R42UN65HZ333HZFWQTGL4",
|
|
393
|
+
"status": "completed"
|
|
394
|
+
}"#;
|
|
395
|
+
|
|
396
|
+
let response: OneDriveMonitorStatus = serde_json::from_str(data).unwrap();
|
|
397
|
+
assert_eq!(response.status, "completed");
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
#[test]
|
|
401
|
+
fn test_parse_one_drive_item_versions_json() {
|
|
402
|
+
let data = r#"{
|
|
403
|
+
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('erickgdev%40outlook.com')/drive/root/versions(id,size,lastModifiedDateTime)",
|
|
404
|
+
"value": [
|
|
405
|
+
{
|
|
406
|
+
"id": "2.0",
|
|
407
|
+
"lastModifiedDateTime": "2025-03-16T17:02:49Z",
|
|
408
|
+
"size": 74758
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"id": "1.0",
|
|
412
|
+
"lastModifiedDateTime": "2025-03-12T21:59:54Z",
|
|
413
|
+
"size": 74756
|
|
414
|
+
}
|
|
415
|
+
]
|
|
416
|
+
}"#;
|
|
417
|
+
|
|
418
|
+
let response: GraphApiOneDriveVersionsResponse = serde_json::from_str(data).unwrap();
|
|
419
|
+
assert_eq!(response.value.len(), 2);
|
|
420
|
+
let version = &response.value[0];
|
|
421
|
+
assert_eq!(version.id, "2.0");
|
|
422
|
+
assert_eq!(version.last_modified_date_time, "2025-03-16T17:02:49Z");
|
|
423
|
+
assert_eq!(version.size, 74758);
|
|
424
|
+
}
|
|
425
|
+
}
|