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,163 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::sync::Arc;
|
|
19
|
+
|
|
20
|
+
use bytes::Buf;
|
|
21
|
+
use http::StatusCode;
|
|
22
|
+
|
|
23
|
+
use super::core::CompleteMultipartUploadRequestPart;
|
|
24
|
+
use super::core::GcsCore;
|
|
25
|
+
use super::core::InitiateMultipartUploadResult;
|
|
26
|
+
use super::error::parse_error;
|
|
27
|
+
use crate::raw::*;
|
|
28
|
+
use crate::*;
|
|
29
|
+
|
|
30
|
+
pub type GcsWriters = oio::MultipartWriter<GcsWriter>;
|
|
31
|
+
|
|
32
|
+
pub struct GcsWriter {
|
|
33
|
+
core: Arc<GcsCore>,
|
|
34
|
+
path: String,
|
|
35
|
+
op: OpWrite,
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
impl GcsWriter {
|
|
39
|
+
pub fn new(core: Arc<GcsCore>, path: &str, op: OpWrite) -> Self {
|
|
40
|
+
GcsWriter {
|
|
41
|
+
core,
|
|
42
|
+
path: path.to_string(),
|
|
43
|
+
op,
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
impl oio::MultipartWrite for GcsWriter {
|
|
49
|
+
async fn write_once(&self, _: u64, body: Buffer) -> Result<Metadata> {
|
|
50
|
+
let size = body.len() as u64;
|
|
51
|
+
let mut req = self.core.gcs_insert_object_request(
|
|
52
|
+
&percent_encode_path(&self.path),
|
|
53
|
+
Some(size),
|
|
54
|
+
&self.op,
|
|
55
|
+
body,
|
|
56
|
+
)?;
|
|
57
|
+
|
|
58
|
+
self.core.sign(&mut req).await?;
|
|
59
|
+
|
|
60
|
+
let resp = self.core.send(req).await?;
|
|
61
|
+
|
|
62
|
+
let status = resp.status();
|
|
63
|
+
|
|
64
|
+
match status {
|
|
65
|
+
StatusCode::CREATED | StatusCode::OK => {
|
|
66
|
+
let metadata =
|
|
67
|
+
GcsCore::build_metadata_from_object_response(&self.path, resp.into_body())?;
|
|
68
|
+
Ok(metadata)
|
|
69
|
+
}
|
|
70
|
+
_ => Err(parse_error(resp)),
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async fn initiate_part(&self) -> Result<String> {
|
|
75
|
+
let resp = self
|
|
76
|
+
.core
|
|
77
|
+
.gcs_initiate_multipart_upload(&percent_encode_path(&self.path), &self.op)
|
|
78
|
+
.await?;
|
|
79
|
+
|
|
80
|
+
if !resp.status().is_success() {
|
|
81
|
+
return Err(parse_error(resp));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let buf = resp.into_body();
|
|
85
|
+
let upload_id: InitiateMultipartUploadResult =
|
|
86
|
+
quick_xml::de::from_reader(buf.reader()).map_err(new_xml_deserialize_error)?;
|
|
87
|
+
Ok(upload_id.upload_id)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async fn write_part(
|
|
91
|
+
&self,
|
|
92
|
+
upload_id: &str,
|
|
93
|
+
part_number: usize,
|
|
94
|
+
size: u64,
|
|
95
|
+
body: Buffer,
|
|
96
|
+
) -> Result<oio::MultipartPart> {
|
|
97
|
+
// Gcs requires part number must between [1..=10000]
|
|
98
|
+
let part_number = part_number + 1;
|
|
99
|
+
|
|
100
|
+
let resp = self
|
|
101
|
+
.core
|
|
102
|
+
.gcs_upload_part(&self.path, upload_id, part_number, size, body)
|
|
103
|
+
.await?;
|
|
104
|
+
|
|
105
|
+
if !resp.status().is_success() {
|
|
106
|
+
return Err(parse_error(resp));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let etag = parse_etag(resp.headers())?
|
|
110
|
+
.ok_or_else(|| {
|
|
111
|
+
Error::new(
|
|
112
|
+
ErrorKind::Unexpected,
|
|
113
|
+
"ETag not present in returning response",
|
|
114
|
+
)
|
|
115
|
+
})?
|
|
116
|
+
.to_string();
|
|
117
|
+
|
|
118
|
+
Ok(oio::MultipartPart {
|
|
119
|
+
part_number,
|
|
120
|
+
etag,
|
|
121
|
+
checksum: None,
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async fn complete_part(
|
|
126
|
+
&self,
|
|
127
|
+
upload_id: &str,
|
|
128
|
+
parts: &[oio::MultipartPart],
|
|
129
|
+
) -> Result<Metadata> {
|
|
130
|
+
let parts = parts
|
|
131
|
+
.iter()
|
|
132
|
+
.map(|p| CompleteMultipartUploadRequestPart {
|
|
133
|
+
part_number: p.part_number,
|
|
134
|
+
etag: p.etag.clone(),
|
|
135
|
+
})
|
|
136
|
+
.collect();
|
|
137
|
+
|
|
138
|
+
let resp = self
|
|
139
|
+
.core
|
|
140
|
+
.gcs_complete_multipart_upload(&self.path, upload_id, parts)
|
|
141
|
+
.await?;
|
|
142
|
+
|
|
143
|
+
if !resp.status().is_success() {
|
|
144
|
+
return Err(parse_error(resp));
|
|
145
|
+
}
|
|
146
|
+
// we don't extract metadata from `CompleteMultipartUploadResult`, since we only need the `ETag` from it.
|
|
147
|
+
// However, the `ETag` differs from the `ETag` obtained through the `stat` operation.
|
|
148
|
+
// refer to: https://cloud.google.com/storage/docs/metadata#etags
|
|
149
|
+
Ok(Metadata::default())
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async fn abort_part(&self, upload_id: &str) -> Result<()> {
|
|
153
|
+
let resp = self
|
|
154
|
+
.core
|
|
155
|
+
.gcs_abort_multipart_upload(&self.path, upload_id)
|
|
156
|
+
.await?;
|
|
157
|
+
match resp.status() {
|
|
158
|
+
// gcs returns code 204 if abort succeeds.
|
|
159
|
+
StatusCode::NO_CONTENT => Ok(()),
|
|
160
|
+
_ => Err(parse_error(resp)),
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::sync::Arc;
|
|
20
|
+
|
|
21
|
+
use bytes::Buf;
|
|
22
|
+
use chrono::Utc;
|
|
23
|
+
use http::Response;
|
|
24
|
+
use http::StatusCode;
|
|
25
|
+
|
|
26
|
+
use super::core::GdriveCore;
|
|
27
|
+
use super::core::GdriveFile;
|
|
28
|
+
use super::delete::GdriveDeleter;
|
|
29
|
+
use super::error::parse_error;
|
|
30
|
+
use super::lister::GdriveLister;
|
|
31
|
+
use super::writer::GdriveWriter;
|
|
32
|
+
use crate::raw::*;
|
|
33
|
+
use crate::*;
|
|
34
|
+
|
|
35
|
+
#[derive(Clone, Debug)]
|
|
36
|
+
pub struct GdriveBackend {
|
|
37
|
+
pub core: Arc<GdriveCore>,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
impl Access for GdriveBackend {
|
|
41
|
+
type Reader = HttpBody;
|
|
42
|
+
type Writer = oio::OneShotWriter<GdriveWriter>;
|
|
43
|
+
type Lister = oio::PageLister<GdriveLister>;
|
|
44
|
+
type Deleter = oio::OneShotDeleter<GdriveDeleter>;
|
|
45
|
+
|
|
46
|
+
fn info(&self) -> Arc<AccessorInfo> {
|
|
47
|
+
self.core.info.clone()
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async fn create_dir(&self, path: &str, _args: OpCreateDir) -> Result<RpCreateDir> {
|
|
51
|
+
let path = build_abs_path(&self.core.root, path);
|
|
52
|
+
let _ = self.core.path_cache.ensure_dir(&path).await?;
|
|
53
|
+
|
|
54
|
+
Ok(RpCreateDir::default())
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
|
|
58
|
+
let resp = self.core.gdrive_stat(path).await?;
|
|
59
|
+
|
|
60
|
+
if resp.status() != StatusCode::OK {
|
|
61
|
+
return Err(parse_error(resp));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let bs = resp.into_body();
|
|
65
|
+
let gdrive_file: GdriveFile =
|
|
66
|
+
serde_json::from_reader(bs.reader()).map_err(new_json_deserialize_error)?;
|
|
67
|
+
|
|
68
|
+
let file_type = if gdrive_file.mime_type == "application/vnd.google-apps.folder" {
|
|
69
|
+
EntryMode::DIR
|
|
70
|
+
} else {
|
|
71
|
+
EntryMode::FILE
|
|
72
|
+
};
|
|
73
|
+
let mut meta = Metadata::new(file_type).with_content_type(gdrive_file.mime_type);
|
|
74
|
+
if let Some(v) = gdrive_file.size {
|
|
75
|
+
meta = meta.with_content_length(v.parse::<u64>().map_err(|e| {
|
|
76
|
+
Error::new(ErrorKind::Unexpected, "parse content length").set_source(e)
|
|
77
|
+
})?);
|
|
78
|
+
}
|
|
79
|
+
if let Some(v) = gdrive_file.modified_time {
|
|
80
|
+
meta = meta.with_last_modified(v.parse::<chrono::DateTime<Utc>>().map_err(|e| {
|
|
81
|
+
Error::new(ErrorKind::Unexpected, "parse last modified time").set_source(e)
|
|
82
|
+
})?);
|
|
83
|
+
}
|
|
84
|
+
Ok(RpStat::new(meta))
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
|
|
88
|
+
let resp = self.core.gdrive_get(path, args.range()).await?;
|
|
89
|
+
|
|
90
|
+
let status = resp.status();
|
|
91
|
+
match status {
|
|
92
|
+
StatusCode::OK | StatusCode::PARTIAL_CONTENT => Ok((RpRead::new(), resp.into_body())),
|
|
93
|
+
_ => {
|
|
94
|
+
let (part, mut body) = resp.into_parts();
|
|
95
|
+
let buf = body.to_buffer().await?;
|
|
96
|
+
Err(parse_error(Response::from_parts(part, buf)))
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
async fn write(&self, path: &str, _: OpWrite) -> Result<(RpWrite, Self::Writer)> {
|
|
102
|
+
let path = build_abs_path(&self.core.root, path);
|
|
103
|
+
|
|
104
|
+
// As Google Drive allows files have the same name, we need to check if the file exists.
|
|
105
|
+
// If the file exists, we will keep its ID and update it.
|
|
106
|
+
let file_id = self.core.path_cache.get(&path).await?;
|
|
107
|
+
|
|
108
|
+
Ok((
|
|
109
|
+
RpWrite::default(),
|
|
110
|
+
oio::OneShotWriter::new(GdriveWriter::new(self.core.clone(), path, file_id)),
|
|
111
|
+
))
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
|
|
115
|
+
Ok((
|
|
116
|
+
RpDelete::default(),
|
|
117
|
+
oio::OneShotDeleter::new(GdriveDeleter::new(self.core.clone())),
|
|
118
|
+
))
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Lister)> {
|
|
122
|
+
let path = build_abs_path(&self.core.root, path);
|
|
123
|
+
let l = GdriveLister::new(path, self.core.clone());
|
|
124
|
+
Ok((RpList::default(), oio::PageLister::new(l)))
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async fn copy(&self, from: &str, to: &str, _args: OpCopy) -> Result<RpCopy> {
|
|
128
|
+
let resp = self.core.gdrive_copy(from, to).await?;
|
|
129
|
+
|
|
130
|
+
match resp.status() {
|
|
131
|
+
StatusCode::OK => Ok(RpCopy::default()),
|
|
132
|
+
_ => Err(parse_error(resp)),
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async fn rename(&self, from: &str, to: &str, _args: OpRename) -> Result<RpRename> {
|
|
137
|
+
let source = build_abs_path(&self.core.root, from);
|
|
138
|
+
let target = build_abs_path(&self.core.root, to);
|
|
139
|
+
|
|
140
|
+
// rename will overwrite `to`, delete it if exist
|
|
141
|
+
if let Some(id) = self.core.path_cache.get(&target).await? {
|
|
142
|
+
let resp = self.core.gdrive_trash(&id).await?;
|
|
143
|
+
let status = resp.status();
|
|
144
|
+
if status != StatusCode::OK {
|
|
145
|
+
return Err(parse_error(resp));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
self.core.path_cache.remove(&target).await;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
let resp = self
|
|
152
|
+
.core
|
|
153
|
+
.gdrive_patch_metadata_request(&source, &target)
|
|
154
|
+
.await?;
|
|
155
|
+
|
|
156
|
+
let status = resp.status();
|
|
157
|
+
|
|
158
|
+
match status {
|
|
159
|
+
StatusCode::OK => {
|
|
160
|
+
let body = resp.into_body();
|
|
161
|
+
let meta: GdriveFile =
|
|
162
|
+
serde_json::from_reader(body.reader()).map_err(new_json_deserialize_error)?;
|
|
163
|
+
|
|
164
|
+
let cache = &self.core.path_cache;
|
|
165
|
+
|
|
166
|
+
cache.remove(&build_abs_path(&self.core.root, from)).await;
|
|
167
|
+
cache
|
|
168
|
+
.insert(&build_abs_path(&self.core.root, to), &meta.id)
|
|
169
|
+
.await;
|
|
170
|
+
|
|
171
|
+
Ok(RpRename::default())
|
|
172
|
+
}
|
|
173
|
+
_ => Err(parse_error(resp)),
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
use std::sync::Arc;
|
|
21
|
+
|
|
22
|
+
use chrono::DateTime;
|
|
23
|
+
use chrono::Utc;
|
|
24
|
+
use log::debug;
|
|
25
|
+
use tokio::sync::Mutex;
|
|
26
|
+
|
|
27
|
+
use super::backend::GdriveBackend;
|
|
28
|
+
use super::core::GdriveCore;
|
|
29
|
+
use super::core::GdrivePathQuery;
|
|
30
|
+
use super::core::GdriveSigner;
|
|
31
|
+
use super::DEFAULT_SCHEME;
|
|
32
|
+
use crate::raw::normalize_root;
|
|
33
|
+
use crate::raw::Access;
|
|
34
|
+
use crate::raw::AccessorInfo;
|
|
35
|
+
use crate::raw::HttpClient;
|
|
36
|
+
use crate::raw::PathCacher;
|
|
37
|
+
use crate::services::GdriveConfig;
|
|
38
|
+
use crate::Scheme;
|
|
39
|
+
use crate::*;
|
|
40
|
+
impl Configurator for GdriveConfig {
|
|
41
|
+
type Builder = GdriveBuilder;
|
|
42
|
+
|
|
43
|
+
#[allow(deprecated)]
|
|
44
|
+
fn into_builder(self) -> Self::Builder {
|
|
45
|
+
GdriveBuilder {
|
|
46
|
+
config: self,
|
|
47
|
+
http_client: None,
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// [GoogleDrive](https://drive.google.com/) backend support.
|
|
53
|
+
#[derive(Default)]
|
|
54
|
+
#[doc = include_str!("docs.md")]
|
|
55
|
+
pub struct GdriveBuilder {
|
|
56
|
+
config: GdriveConfig,
|
|
57
|
+
|
|
58
|
+
#[deprecated(since = "0.53.0", note = "Use `Operator::update_http_client` instead")]
|
|
59
|
+
http_client: Option<HttpClient>,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
impl Debug for GdriveBuilder {
|
|
63
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
64
|
+
f.debug_struct("Backend")
|
|
65
|
+
.field("config", &self.config)
|
|
66
|
+
.finish()
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
impl GdriveBuilder {
|
|
71
|
+
/// Set root path of GoogleDrive folder.
|
|
72
|
+
pub fn root(mut self, root: &str) -> Self {
|
|
73
|
+
self.config.root = if root.is_empty() {
|
|
74
|
+
None
|
|
75
|
+
} else {
|
|
76
|
+
Some(root.to_string())
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
self
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/// Access token is used for temporary access to the GoogleDrive API.
|
|
83
|
+
///
|
|
84
|
+
/// You can get the access token from [GoogleDrive App Console](https://console.cloud.google.com/apis/credentials)
|
|
85
|
+
/// or [GoogleDrive OAuth2 Playground](https://developers.google.com/oauthplayground/)
|
|
86
|
+
///
|
|
87
|
+
/// # Note
|
|
88
|
+
///
|
|
89
|
+
/// - An access token is valid for 1 hour.
|
|
90
|
+
/// - If you want to use the access token for a long time,
|
|
91
|
+
/// you can use the refresh token to get a new access token.
|
|
92
|
+
pub fn access_token(mut self, access_token: &str) -> Self {
|
|
93
|
+
self.config.access_token = Some(access_token.to_string());
|
|
94
|
+
self
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/// Refresh token is used for long term access to the GoogleDrive API.
|
|
98
|
+
///
|
|
99
|
+
/// You can get the refresh token via OAuth 2.0 Flow of GoogleDrive API.
|
|
100
|
+
///
|
|
101
|
+
/// OpenDAL will use this refresh token to get a new access token when the old one is expired.
|
|
102
|
+
pub fn refresh_token(mut self, refresh_token: &str) -> Self {
|
|
103
|
+
self.config.refresh_token = Some(refresh_token.to_string());
|
|
104
|
+
self
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/// Set the client id for GoogleDrive.
|
|
108
|
+
///
|
|
109
|
+
/// This is required for OAuth 2.0 Flow to refresh the access token.
|
|
110
|
+
pub fn client_id(mut self, client_id: &str) -> Self {
|
|
111
|
+
self.config.client_id = Some(client_id.to_string());
|
|
112
|
+
self
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/// Set the client secret for GoogleDrive.
|
|
116
|
+
///
|
|
117
|
+
/// This is required for OAuth 2.0 Flow with refresh the access token.
|
|
118
|
+
pub fn client_secret(mut self, client_secret: &str) -> Self {
|
|
119
|
+
self.config.client_secret = Some(client_secret.to_string());
|
|
120
|
+
self
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/// Specify the http client that used by this service.
|
|
124
|
+
///
|
|
125
|
+
/// # Notes
|
|
126
|
+
///
|
|
127
|
+
/// This API is part of OpenDAL's Raw API. `HttpClient` could be changed
|
|
128
|
+
/// during minor updates.
|
|
129
|
+
#[deprecated(since = "0.53.0", note = "Use `Operator::update_http_client` instead")]
|
|
130
|
+
#[allow(deprecated)]
|
|
131
|
+
pub fn http_client(mut self, http_client: HttpClient) -> Self {
|
|
132
|
+
self.http_client = Some(http_client);
|
|
133
|
+
self
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
impl Builder for GdriveBuilder {
|
|
138
|
+
type Config = GdriveConfig;
|
|
139
|
+
|
|
140
|
+
fn build(self) -> Result<impl Access> {
|
|
141
|
+
let root = normalize_root(&self.config.root.unwrap_or_default());
|
|
142
|
+
debug!("backend use root {root}");
|
|
143
|
+
|
|
144
|
+
let info = AccessorInfo::default();
|
|
145
|
+
info.set_scheme(DEFAULT_SCHEME)
|
|
146
|
+
.set_root(&root)
|
|
147
|
+
.set_native_capability(Capability {
|
|
148
|
+
stat: true,
|
|
149
|
+
|
|
150
|
+
read: true,
|
|
151
|
+
|
|
152
|
+
list: true,
|
|
153
|
+
|
|
154
|
+
write: true,
|
|
155
|
+
|
|
156
|
+
create_dir: true,
|
|
157
|
+
delete: true,
|
|
158
|
+
rename: true,
|
|
159
|
+
copy: true,
|
|
160
|
+
|
|
161
|
+
shared: true,
|
|
162
|
+
|
|
163
|
+
..Default::default()
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// allow deprecated api here for compatibility
|
|
167
|
+
#[allow(deprecated)]
|
|
168
|
+
if let Some(client) = self.http_client {
|
|
169
|
+
info.update_http_client(|_| client);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
let accessor_info = Arc::new(info);
|
|
173
|
+
let mut signer = GdriveSigner::new(accessor_info.clone());
|
|
174
|
+
match (self.config.access_token, self.config.refresh_token) {
|
|
175
|
+
(Some(access_token), None) => {
|
|
176
|
+
signer.access_token = access_token;
|
|
177
|
+
// We will never expire user specified access token.
|
|
178
|
+
signer.expires_in = DateTime::<Utc>::MAX_UTC;
|
|
179
|
+
}
|
|
180
|
+
(None, Some(refresh_token)) => {
|
|
181
|
+
let client_id = self.config.client_id.ok_or_else(|| {
|
|
182
|
+
Error::new(
|
|
183
|
+
ErrorKind::ConfigInvalid,
|
|
184
|
+
"client_id must be set when refresh_token is set",
|
|
185
|
+
)
|
|
186
|
+
.with_context("service", Scheme::Gdrive)
|
|
187
|
+
})?;
|
|
188
|
+
let client_secret = self.config.client_secret.ok_or_else(|| {
|
|
189
|
+
Error::new(
|
|
190
|
+
ErrorKind::ConfigInvalid,
|
|
191
|
+
"client_secret must be set when refresh_token is set",
|
|
192
|
+
)
|
|
193
|
+
.with_context("service", Scheme::Gdrive)
|
|
194
|
+
})?;
|
|
195
|
+
|
|
196
|
+
signer.refresh_token = refresh_token;
|
|
197
|
+
signer.client_id = client_id;
|
|
198
|
+
signer.client_secret = client_secret;
|
|
199
|
+
}
|
|
200
|
+
(Some(_), Some(_)) => {
|
|
201
|
+
return Err(Error::new(
|
|
202
|
+
ErrorKind::ConfigInvalid,
|
|
203
|
+
"access_token and refresh_token cannot be set at the same time",
|
|
204
|
+
)
|
|
205
|
+
.with_context("service", Scheme::Gdrive))
|
|
206
|
+
}
|
|
207
|
+
(None, None) => {
|
|
208
|
+
return Err(Error::new(
|
|
209
|
+
ErrorKind::ConfigInvalid,
|
|
210
|
+
"access_token or refresh_token must be set",
|
|
211
|
+
)
|
|
212
|
+
.with_context("service", Scheme::Gdrive))
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
let signer = Arc::new(Mutex::new(signer));
|
|
217
|
+
|
|
218
|
+
Ok(GdriveBackend {
|
|
219
|
+
core: Arc::new(GdriveCore {
|
|
220
|
+
info: accessor_info.clone(),
|
|
221
|
+
root,
|
|
222
|
+
signer: signer.clone(),
|
|
223
|
+
path_cache: PathCacher::new(GdrivePathQuery::new(accessor_info, signer))
|
|
224
|
+
.with_lock(),
|
|
225
|
+
}),
|
|
226
|
+
})
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -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::fmt::Debug;
|
|
19
|
+
use std::fmt::Formatter;
|
|
20
|
+
|
|
21
|
+
use serde::Deserialize;
|
|
22
|
+
use serde::Serialize;
|
|
23
|
+
|
|
24
|
+
/// [GoogleDrive](https://drive.google.com/) configuration.
|
|
25
|
+
#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
|
|
26
|
+
#[serde(default)]
|
|
27
|
+
#[non_exhaustive]
|
|
28
|
+
pub struct GdriveConfig {
|
|
29
|
+
/// The root for gdrive
|
|
30
|
+
pub root: Option<String>,
|
|
31
|
+
/// Access token for gdrive.
|
|
32
|
+
pub access_token: Option<String>,
|
|
33
|
+
/// Refresh token for gdrive.
|
|
34
|
+
pub refresh_token: Option<String>,
|
|
35
|
+
/// Client id for gdrive.
|
|
36
|
+
pub client_id: Option<String>,
|
|
37
|
+
/// Client secret for gdrive.
|
|
38
|
+
pub client_secret: Option<String>,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
impl Debug for GdriveConfig {
|
|
42
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
43
|
+
f.debug_struct("GdriveConfig")
|
|
44
|
+
.field("root", &self.root)
|
|
45
|
+
.finish_non_exhaustive()
|
|
46
|
+
}
|
|
47
|
+
}
|