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.
Files changed (809) hide show
  1. checksums.yaml +7 -0
  2. data/.standard.yml +20 -0
  3. data/.tool-versions +1 -0
  4. data/.yardopts +1 -0
  5. data/Cargo.toml +65 -0
  6. data/DEPENDENCIES.md +9 -0
  7. data/DEPENDENCIES.rust.tsv +277 -0
  8. data/Gemfile +35 -0
  9. data/README.md +159 -0
  10. data/Rakefile +149 -0
  11. data/build.rs +22 -0
  12. data/core/CHANGELOG.md +4929 -0
  13. data/core/CONTRIBUTING.md +61 -0
  14. data/core/Cargo.lock +10259 -0
  15. data/core/Cargo.toml +437 -0
  16. data/core/DEPENDENCIES.md +3 -0
  17. data/core/DEPENDENCIES.rust.tsv +185 -0
  18. data/core/LICENSE +201 -0
  19. data/core/README.md +228 -0
  20. data/core/benches/README.md +18 -0
  21. data/core/benches/ops/README.md +26 -0
  22. data/core/benches/ops/main.rs +25 -0
  23. data/core/benches/ops/read.rs +100 -0
  24. data/core/benches/ops/utils.rs +59 -0
  25. data/core/benches/ops/write.rs +106 -0
  26. data/core/benches/types/README.md +9 -0
  27. data/core/benches/types/buffer.rs +114 -0
  28. data/core/benches/types/main.rs +23 -0
  29. data/core/benches/types/tasks.rs +64 -0
  30. data/core/benches/vs_fs/Cargo.toml +32 -0
  31. data/core/benches/vs_fs/README.md +35 -0
  32. data/core/benches/vs_fs/src/main.rs +83 -0
  33. data/core/benches/vs_s3/Cargo.toml +38 -0
  34. data/core/benches/vs_s3/README.md +55 -0
  35. data/core/benches/vs_s3/src/main.rs +123 -0
  36. data/core/edge/README.md +3 -0
  37. data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
  38. data/core/edge/file_write_on_full_disk/README.md +14 -0
  39. data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
  40. data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
  41. data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
  42. data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
  43. data/core/edge/s3_read_on_wasm/.gitignore +3 -0
  44. data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
  45. data/core/edge/s3_read_on_wasm/README.md +42 -0
  46. data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
  47. data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
  48. data/core/examples/README.md +23 -0
  49. data/core/examples/basic/Cargo.toml +29 -0
  50. data/core/examples/basic/README.md +15 -0
  51. data/core/examples/basic/src/main.rs +51 -0
  52. data/core/examples/concurrent-upload/Cargo.toml +29 -0
  53. data/core/examples/concurrent-upload/README.md +15 -0
  54. data/core/examples/concurrent-upload/src/main.rs +68 -0
  55. data/core/examples/multipart-upload/Cargo.toml +29 -0
  56. data/core/examples/multipart-upload/README.md +15 -0
  57. data/core/examples/multipart-upload/src/main.rs +56 -0
  58. data/core/fuzz/.gitignore +5 -0
  59. data/core/fuzz/Cargo.toml +92 -0
  60. data/core/fuzz/README.md +68 -0
  61. data/core/fuzz/fuzz_reader.rs +102 -0
  62. data/core/fuzz/fuzz_writer.rs +123 -0
  63. data/core/src/blocking/delete.rs +74 -0
  64. data/core/src/blocking/list.rs +71 -0
  65. data/core/src/blocking/mod.rs +33 -0
  66. data/core/src/blocking/operator.rs +729 -0
  67. data/core/src/blocking/read/buffer_iterator.rs +66 -0
  68. data/core/src/blocking/read/mod.rs +27 -0
  69. data/core/src/blocking/read/reader.rs +124 -0
  70. data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
  71. data/core/src/blocking/read/std_reader.rs +95 -0
  72. data/core/src/blocking/write/mod.rs +22 -0
  73. data/core/src/blocking/write/std_writer.rs +82 -0
  74. data/core/src/blocking/write/writer.rs +109 -0
  75. data/core/src/docs/comparisons/mod.rs +30 -0
  76. data/core/src/docs/comparisons/vs_object_store.md +183 -0
  77. data/core/src/docs/concepts.rs +135 -0
  78. data/core/src/docs/internals/accessor.rs +306 -0
  79. data/core/src/docs/internals/layer.rs +42 -0
  80. data/core/src/docs/internals/mod.rs +62 -0
  81. data/core/src/docs/mod.rs +43 -0
  82. data/core/src/docs/performance/concurrent_write.md +101 -0
  83. data/core/src/docs/performance/http_optimization.md +124 -0
  84. data/core/src/docs/performance/mod.rs +32 -0
  85. data/core/src/docs/rfcs/0000_example.md +74 -0
  86. data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
  87. data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
  88. data/core/src/docs/rfcs/0044_error_handle.md +198 -0
  89. data/core/src/docs/rfcs/0057_auto_region.md +160 -0
  90. data/core/src/docs/rfcs/0069_object_stream.md +145 -0
  91. data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
  92. data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
  93. data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
  94. data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
  95. data/core/src/docs/rfcs/0221_create_dir.md +89 -0
  96. data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
  97. data/core/src/docs/rfcs/0293_object_id.md +67 -0
  98. data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
  99. data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
  100. data/core/src/docs/rfcs/0413_presign.md +154 -0
  101. data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
  102. data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
  103. data/core/src/docs/rfcs/0438_multipart.md +163 -0
  104. data/core/src/docs/rfcs/0443_gateway.md +73 -0
  105. data/core/src/docs/rfcs/0501_new_builder.md +111 -0
  106. data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
  107. data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
  108. data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
  109. data/core/src/docs/rfcs/0623_redis_service.md +300 -0
  110. data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
  111. data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
  112. data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
  113. data/core/src/docs/rfcs/0926_object_reader.md +93 -0
  114. data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
  115. data/core/src/docs/rfcs/1085_object_handler.md +73 -0
  116. data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
  117. data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
  118. data/core/src/docs/rfcs/1420_object_writer.md +147 -0
  119. data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
  120. data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
  121. data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
  122. data/core/src/docs/rfcs/2133_append_api.md +88 -0
  123. data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
  124. data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
  125. data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
  126. data/core/src/docs/rfcs/2774_lister_api.md +66 -0
  127. data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
  128. data/core/src/docs/rfcs/2852_native_capability.md +58 -0
  129. data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
  130. data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
  131. data/core/src/docs/rfcs/3197_config.md +237 -0
  132. data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
  133. data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
  134. data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
  135. data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
  136. data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
  137. data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
  138. data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
  139. data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
  140. data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
  141. data/core/src/docs/rfcs/4638_executor.md +215 -0
  142. data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
  143. data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
  144. data/core/src/docs/rfcs/5479_context.md +140 -0
  145. data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
  146. data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
  147. data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
  148. data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
  149. data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
  150. data/core/src/docs/rfcs/6209_glob_support.md +132 -0
  151. data/core/src/docs/rfcs/6213_options_api.md +142 -0
  152. data/core/src/docs/rfcs/README.md +62 -0
  153. data/core/src/docs/rfcs/mod.rs +278 -0
  154. data/core/src/docs/upgrade.md +1556 -0
  155. data/core/src/layers/async_backtrace.rs +174 -0
  156. data/core/src/layers/await_tree.rs +202 -0
  157. data/core/src/layers/capability_check.rs +239 -0
  158. data/core/src/layers/chaos.rs +170 -0
  159. data/core/src/layers/complete.rs +385 -0
  160. data/core/src/layers/concurrent_limit.rs +322 -0
  161. data/core/src/layers/correctness_check.rs +440 -0
  162. data/core/src/layers/dtrace.rs +294 -0
  163. data/core/src/layers/error_context.rs +310 -0
  164. data/core/src/layers/fastmetrics.rs +525 -0
  165. data/core/src/layers/fastrace.rs +271 -0
  166. data/core/src/layers/http_client.rs +206 -0
  167. data/core/src/layers/immutable_index.rs +408 -0
  168. data/core/src/layers/logging.rs +842 -0
  169. data/core/src/layers/metrics.rs +182 -0
  170. data/core/src/layers/mime_guess.rs +199 -0
  171. data/core/src/layers/mod.rs +130 -0
  172. data/core/src/layers/observe/metrics.rs +936 -0
  173. data/core/src/layers/observe/mod.rs +93 -0
  174. data/core/src/layers/otelmetrics.rs +496 -0
  175. data/core/src/layers/oteltrace.rs +203 -0
  176. data/core/src/layers/prometheus.rs +686 -0
  177. data/core/src/layers/prometheus_client.rs +519 -0
  178. data/core/src/layers/retry.rs +933 -0
  179. data/core/src/layers/throttle.rs +204 -0
  180. data/core/src/layers/timeout.rs +513 -0
  181. data/core/src/layers/tracing.rs +349 -0
  182. data/core/src/layers/type_eraser.rs +91 -0
  183. data/core/src/lib.rs +204 -0
  184. data/core/src/raw/accessor.rs +856 -0
  185. data/core/src/raw/adapters/kv/api.rs +164 -0
  186. data/core/src/raw/adapters/kv/backend.rs +253 -0
  187. data/core/src/raw/adapters/kv/mod.rs +31 -0
  188. data/core/src/raw/adapters/mod.rs +50 -0
  189. data/core/src/raw/adapters/typed_kv/api.rs +171 -0
  190. data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
  191. data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
  192. data/core/src/raw/atomic_util.rs +57 -0
  193. data/core/src/raw/azure.rs +570 -0
  194. data/core/src/raw/chrono_util.rs +109 -0
  195. data/core/src/raw/enum_utils.rs +201 -0
  196. data/core/src/raw/futures_util.rs +470 -0
  197. data/core/src/raw/http_util/body.rs +144 -0
  198. data/core/src/raw/http_util/bytes_content_range.rs +239 -0
  199. data/core/src/raw/http_util/bytes_range.rs +260 -0
  200. data/core/src/raw/http_util/client.rs +276 -0
  201. data/core/src/raw/http_util/error.rs +68 -0
  202. data/core/src/raw/http_util/header.rs +356 -0
  203. data/core/src/raw/http_util/mod.rs +78 -0
  204. data/core/src/raw/http_util/multipart.rs +1180 -0
  205. data/core/src/raw/http_util/uri.rs +190 -0
  206. data/core/src/raw/layer.rs +295 -0
  207. data/core/src/raw/mod.rs +101 -0
  208. data/core/src/raw/oio/buf/flex_buf.rs +118 -0
  209. data/core/src/raw/oio/buf/mod.rs +25 -0
  210. data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
  211. data/core/src/raw/oio/buf/queue_buf.rs +117 -0
  212. data/core/src/raw/oio/delete/api.rs +102 -0
  213. data/core/src/raw/oio/delete/batch_delete.rs +127 -0
  214. data/core/src/raw/oio/delete/mod.rs +30 -0
  215. data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
  216. data/core/src/raw/oio/entry.rs +89 -0
  217. data/core/src/raw/oio/list/api.rs +69 -0
  218. data/core/src/raw/oio/list/flat_list.rs +137 -0
  219. data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
  220. data/core/src/raw/oio/list/mod.rs +35 -0
  221. data/core/src/raw/oio/list/page_list.rs +105 -0
  222. data/core/src/raw/oio/list/prefix_list.rs +64 -0
  223. data/core/src/raw/oio/mod.rs +40 -0
  224. data/core/src/raw/oio/read/api.rs +119 -0
  225. data/core/src/raw/oio/read/mod.rs +21 -0
  226. data/core/src/raw/oio/write/api.rs +103 -0
  227. data/core/src/raw/oio/write/append_write.rs +111 -0
  228. data/core/src/raw/oio/write/block_write.rs +405 -0
  229. data/core/src/raw/oio/write/mod.rs +42 -0
  230. data/core/src/raw/oio/write/multipart_write.rs +518 -0
  231. data/core/src/raw/oio/write/one_shot_write.rs +77 -0
  232. data/core/src/raw/oio/write/position_write.rs +284 -0
  233. data/core/src/raw/operation.rs +88 -0
  234. data/core/src/raw/ops.rs +917 -0
  235. data/core/src/raw/path.rs +451 -0
  236. data/core/src/raw/path_cache.rs +244 -0
  237. data/core/src/raw/rps.rs +249 -0
  238. data/core/src/raw/serde_util.rs +423 -0
  239. data/core/src/raw/std_io_util.rs +65 -0
  240. data/core/src/raw/tests/mod.rs +30 -0
  241. data/core/src/raw/tests/read.rs +116 -0
  242. data/core/src/raw/tests/utils.rs +80 -0
  243. data/core/src/raw/tests/write.rs +79 -0
  244. data/core/src/raw/tokio_util.rs +24 -0
  245. data/core/src/raw/version.rs +19 -0
  246. data/core/src/services/aliyun_drive/backend.rs +421 -0
  247. data/core/src/services/aliyun_drive/config.rs +72 -0
  248. data/core/src/services/aliyun_drive/core.rs +651 -0
  249. data/core/src/services/aliyun_drive/delete.rs +51 -0
  250. data/core/src/services/aliyun_drive/docs.md +61 -0
  251. data/core/src/services/aliyun_drive/error.rs +56 -0
  252. data/core/src/services/aliyun_drive/lister.rs +134 -0
  253. data/core/src/services/aliyun_drive/mod.rs +39 -0
  254. data/core/src/services/aliyun_drive/writer.rs +114 -0
  255. data/core/src/services/alluxio/backend.rs +257 -0
  256. data/core/src/services/alluxio/config.rs +50 -0
  257. data/core/src/services/alluxio/core.rs +367 -0
  258. data/core/src/services/alluxio/delete.rs +38 -0
  259. data/core/src/services/alluxio/docs.md +45 -0
  260. data/core/src/services/alluxio/error.rs +99 -0
  261. data/core/src/services/alluxio/lister.rs +73 -0
  262. data/core/src/services/alluxio/mod.rs +39 -0
  263. data/core/src/services/alluxio/writer.rs +74 -0
  264. data/core/src/services/azblob/backend.rs +594 -0
  265. data/core/src/services/azblob/config.rs +220 -0
  266. data/core/src/services/azblob/core.rs +937 -0
  267. data/core/src/services/azblob/delete.rs +108 -0
  268. data/core/src/services/azblob/docs.md +77 -0
  269. data/core/src/services/azblob/error.rs +164 -0
  270. data/core/src/services/azblob/lister.rs +107 -0
  271. data/core/src/services/azblob/mod.rs +38 -0
  272. data/core/src/services/azblob/writer.rs +177 -0
  273. data/core/src/services/azdls/backend.rs +435 -0
  274. data/core/src/services/azdls/config.rs +89 -0
  275. data/core/src/services/azdls/core.rs +388 -0
  276. data/core/src/services/azdls/delete.rs +48 -0
  277. data/core/src/services/azdls/docs.md +73 -0
  278. data/core/src/services/azdls/error.rs +107 -0
  279. data/core/src/services/azdls/lister.rs +165 -0
  280. data/core/src/services/azdls/mod.rs +38 -0
  281. data/core/src/services/azdls/writer.rs +129 -0
  282. data/core/src/services/azfile/backend.rs +373 -0
  283. data/core/src/services/azfile/config.rs +61 -0
  284. data/core/src/services/azfile/core.rs +435 -0
  285. data/core/src/services/azfile/delete.rs +51 -0
  286. data/core/src/services/azfile/docs.md +65 -0
  287. data/core/src/services/azfile/error.rs +108 -0
  288. data/core/src/services/azfile/lister.rs +217 -0
  289. data/core/src/services/azfile/mod.rs +39 -0
  290. data/core/src/services/azfile/writer.rs +92 -0
  291. data/core/src/services/b2/backend.rs +434 -0
  292. data/core/src/services/b2/config.rs +64 -0
  293. data/core/src/services/b2/core.rs +742 -0
  294. data/core/src/services/b2/delete.rs +56 -0
  295. data/core/src/services/b2/docs.md +54 -0
  296. data/core/src/services/b2/error.rs +132 -0
  297. data/core/src/services/b2/lister.rs +110 -0
  298. data/core/src/services/b2/mod.rs +39 -0
  299. data/core/src/services/b2/writer.rs +189 -0
  300. data/core/src/services/cacache/backend.rs +160 -0
  301. data/core/src/services/cacache/config.rs +28 -0
  302. data/core/src/services/cacache/core.rs +96 -0
  303. data/core/src/services/cacache/delete.rs +39 -0
  304. data/core/src/services/cacache/docs.md +38 -0
  305. data/core/src/services/cacache/mod.rs +34 -0
  306. data/core/src/services/cacache/writer.rs +61 -0
  307. data/core/src/services/cloudflare_kv/backend.rs +513 -0
  308. data/core/src/services/cloudflare_kv/config.rs +55 -0
  309. data/core/src/services/cloudflare_kv/core.rs +168 -0
  310. data/core/src/services/cloudflare_kv/delete.rs +119 -0
  311. data/core/src/services/cloudflare_kv/docs.md +21 -0
  312. data/core/src/services/cloudflare_kv/error.rs +79 -0
  313. data/core/src/services/cloudflare_kv/lister.rs +170 -0
  314. data/core/src/services/cloudflare_kv/mod.rs +39 -0
  315. data/core/src/services/cloudflare_kv/model.rs +76 -0
  316. data/core/src/services/cloudflare_kv/writer.rs +68 -0
  317. data/core/src/services/compfs/backend.rs +290 -0
  318. data/core/src/services/compfs/config.rs +30 -0
  319. data/core/src/services/compfs/core.rs +159 -0
  320. data/core/src/services/compfs/delete.rs +53 -0
  321. data/core/src/services/compfs/lister.rs +98 -0
  322. data/core/src/services/compfs/mod.rs +38 -0
  323. data/core/src/services/compfs/reader.rs +79 -0
  324. data/core/src/services/compfs/writer.rs +90 -0
  325. data/core/src/services/cos/backend.rs +442 -0
  326. data/core/src/services/cos/config.rs +54 -0
  327. data/core/src/services/cos/core.rs +761 -0
  328. data/core/src/services/cos/delete.rs +48 -0
  329. data/core/src/services/cos/docs.md +55 -0
  330. data/core/src/services/cos/error.rs +105 -0
  331. data/core/src/services/cos/lister.rs +237 -0
  332. data/core/src/services/cos/mod.rs +39 -0
  333. data/core/src/services/cos/writer.rs +234 -0
  334. data/core/src/services/d1/backend.rs +330 -0
  335. data/core/src/services/d1/config.rs +55 -0
  336. data/core/src/services/d1/docs.md +48 -0
  337. data/core/src/services/d1/error.rs +79 -0
  338. data/core/src/services/d1/mod.rs +29 -0
  339. data/core/src/services/d1/model.rs +125 -0
  340. data/core/src/services/dashmap/backend.rs +203 -0
  341. data/core/src/services/dashmap/config.rs +37 -0
  342. data/core/src/services/dashmap/core.rs +61 -0
  343. data/core/src/services/dashmap/delete.rs +40 -0
  344. data/core/src/services/dashmap/docs.md +38 -0
  345. data/core/src/services/dashmap/lister.rs +63 -0
  346. data/core/src/services/dashmap/mod.rs +36 -0
  347. data/core/src/services/dashmap/writer.rs +87 -0
  348. data/core/src/services/dbfs/backend.rs +258 -0
  349. data/core/src/services/dbfs/config.rs +48 -0
  350. data/core/src/services/dbfs/core.rs +191 -0
  351. data/core/src/services/dbfs/delete.rs +49 -0
  352. data/core/src/services/dbfs/docs.md +57 -0
  353. data/core/src/services/dbfs/error.rs +74 -0
  354. data/core/src/services/dbfs/lister.rs +96 -0
  355. data/core/src/services/dbfs/mod.rs +38 -0
  356. data/core/src/services/dbfs/writer.rs +64 -0
  357. data/core/src/services/dropbox/backend.rs +187 -0
  358. data/core/src/services/dropbox/builder.rs +222 -0
  359. data/core/src/services/dropbox/config.rs +47 -0
  360. data/core/src/services/dropbox/core.rs +496 -0
  361. data/core/src/services/dropbox/delete.rs +54 -0
  362. data/core/src/services/dropbox/docs.md +64 -0
  363. data/core/src/services/dropbox/error.rs +85 -0
  364. data/core/src/services/dropbox/lister.rs +117 -0
  365. data/core/src/services/dropbox/mod.rs +40 -0
  366. data/core/src/services/dropbox/writer.rs +51 -0
  367. data/core/src/services/etcd/backend.rs +345 -0
  368. data/core/src/services/etcd/config.rs +86 -0
  369. data/core/src/services/etcd/core.rs +143 -0
  370. data/core/src/services/etcd/deleter.rs +41 -0
  371. data/core/src/services/etcd/docs.md +45 -0
  372. data/core/src/services/etcd/error.rs +26 -0
  373. data/core/src/services/etcd/lister.rs +79 -0
  374. data/core/src/services/etcd/mod.rs +36 -0
  375. data/core/src/services/etcd/writer.rs +61 -0
  376. data/core/src/services/foundationdb/backend.rs +171 -0
  377. data/core/src/services/foundationdb/config.rs +45 -0
  378. data/core/src/services/foundationdb/docs.md +42 -0
  379. data/core/src/services/foundationdb/mod.rs +24 -0
  380. data/core/src/services/fs/backend.rs +299 -0
  381. data/core/src/services/fs/config.rs +33 -0
  382. data/core/src/services/fs/core.rs +227 -0
  383. data/core/src/services/fs/delete.rs +53 -0
  384. data/core/src/services/fs/docs.md +49 -0
  385. data/core/src/services/fs/error.rs +31 -0
  386. data/core/src/services/fs/lister.rs +81 -0
  387. data/core/src/services/fs/mod.rs +40 -0
  388. data/core/src/services/fs/reader.rs +83 -0
  389. data/core/src/services/fs/writer.rs +212 -0
  390. data/core/src/services/ftp/backend.rs +388 -0
  391. data/core/src/services/ftp/config.rs +46 -0
  392. data/core/src/services/ftp/core.rs +136 -0
  393. data/core/src/services/ftp/delete.rs +62 -0
  394. data/core/src/services/ftp/docs.md +42 -0
  395. data/core/src/services/ftp/err.rs +47 -0
  396. data/core/src/services/ftp/lister.rs +72 -0
  397. data/core/src/services/ftp/mod.rs +41 -0
  398. data/core/src/services/ftp/reader.rs +84 -0
  399. data/core/src/services/ftp/writer.rs +122 -0
  400. data/core/src/services/gcs/backend.rs +499 -0
  401. data/core/src/services/gcs/config.rs +168 -0
  402. data/core/src/services/gcs/core.rs +1079 -0
  403. data/core/src/services/gcs/delete.rs +98 -0
  404. data/core/src/services/gcs/docs.md +76 -0
  405. data/core/src/services/gcs/error.rs +122 -0
  406. data/core/src/services/gcs/lister.rs +136 -0
  407. data/core/src/services/gcs/mod.rs +40 -0
  408. data/core/src/services/gcs/uri.rs +75 -0
  409. data/core/src/services/gcs/writer.rs +163 -0
  410. data/core/src/services/gdrive/backend.rs +176 -0
  411. data/core/src/services/gdrive/builder.rs +228 -0
  412. data/core/src/services/gdrive/config.rs +47 -0
  413. data/core/src/services/gdrive/core.rs +499 -0
  414. data/core/src/services/gdrive/delete.rs +57 -0
  415. data/core/src/services/gdrive/docs.md +65 -0
  416. data/core/src/services/gdrive/error.rs +80 -0
  417. data/core/src/services/gdrive/lister.rs +110 -0
  418. data/core/src/services/gdrive/mod.rs +40 -0
  419. data/core/src/services/gdrive/writer.rs +77 -0
  420. data/core/src/services/ghac/backend.rs +285 -0
  421. data/core/src/services/ghac/config.rs +36 -0
  422. data/core/src/services/ghac/core.rs +459 -0
  423. data/core/src/services/ghac/docs.md +84 -0
  424. data/core/src/services/ghac/error.rs +52 -0
  425. data/core/src/services/ghac/mod.rs +35 -0
  426. data/core/src/services/ghac/writer.rs +201 -0
  427. data/core/src/services/github/backend.rs +285 -0
  428. data/core/src/services/github/config.rs +59 -0
  429. data/core/src/services/github/core.rs +351 -0
  430. data/core/src/services/github/delete.rs +41 -0
  431. data/core/src/services/github/docs.md +52 -0
  432. data/core/src/services/github/error.rs +101 -0
  433. data/core/src/services/github/lister.rs +112 -0
  434. data/core/src/services/github/mod.rs +38 -0
  435. data/core/src/services/github/writer.rs +51 -0
  436. data/core/src/services/gridfs/backend.rs +166 -0
  437. data/core/src/services/gridfs/config.rs +50 -0
  438. data/core/src/services/gridfs/core.rs +154 -0
  439. data/core/src/services/gridfs/docs.md +46 -0
  440. data/core/src/services/gridfs/mod.rs +26 -0
  441. data/core/src/services/hdfs/backend.rs +413 -0
  442. data/core/src/services/hdfs/config.rs +59 -0
  443. data/core/src/services/hdfs/delete.rs +62 -0
  444. data/core/src/services/hdfs/docs.md +140 -0
  445. data/core/src/services/hdfs/lister.rs +70 -0
  446. data/core/src/services/hdfs/mod.rs +36 -0
  447. data/core/src/services/hdfs/reader.rs +79 -0
  448. data/core/src/services/hdfs/writer.rs +104 -0
  449. data/core/src/services/hdfs_native/backend.rs +340 -0
  450. data/core/src/services/hdfs_native/config.rs +45 -0
  451. data/core/src/services/hdfs_native/delete.rs +47 -0
  452. data/core/src/services/hdfs_native/docs.md +35 -0
  453. data/core/src/services/hdfs_native/error.rs +59 -0
  454. data/core/src/services/hdfs_native/lister.rs +85 -0
  455. data/core/src/services/hdfs_native/mod.rs +39 -0
  456. data/core/src/services/hdfs_native/reader.rs +62 -0
  457. data/core/src/services/hdfs_native/writer.rs +61 -0
  458. data/core/src/services/http/backend.rs +291 -0
  459. data/core/src/services/http/config.rs +49 -0
  460. data/core/src/services/http/core.rs +125 -0
  461. data/core/src/services/http/docs.md +45 -0
  462. data/core/src/services/http/error.rs +53 -0
  463. data/core/src/services/http/mod.rs +32 -0
  464. data/core/src/services/huggingface/backend.rs +289 -0
  465. data/core/src/services/huggingface/config.rs +75 -0
  466. data/core/src/services/huggingface/core.rs +406 -0
  467. data/core/src/services/huggingface/docs.md +61 -0
  468. data/core/src/services/huggingface/error.rs +93 -0
  469. data/core/src/services/huggingface/lister.rs +91 -0
  470. data/core/src/services/huggingface/mod.rs +34 -0
  471. data/core/src/services/ipfs/backend.rs +257 -0
  472. data/core/src/services/ipfs/config.rs +32 -0
  473. data/core/src/services/ipfs/core.rs +239 -0
  474. data/core/src/services/ipfs/docs.md +45 -0
  475. data/core/src/services/ipfs/error.rs +52 -0
  476. data/core/src/services/ipfs/ipld.rs +162 -0
  477. data/core/src/services/ipfs/mod.rs +34 -0
  478. data/core/src/services/ipmfs/backend.rs +147 -0
  479. data/core/src/services/ipmfs/builder.rs +166 -0
  480. data/core/src/services/ipmfs/config.rs +32 -0
  481. data/core/src/services/ipmfs/core.rs +142 -0
  482. data/core/src/services/ipmfs/delete.rs +48 -0
  483. data/core/src/services/ipmfs/docs.md +14 -0
  484. data/core/src/services/ipmfs/error.rs +83 -0
  485. data/core/src/services/ipmfs/lister.rs +135 -0
  486. data/core/src/services/ipmfs/mod.rs +40 -0
  487. data/core/src/services/ipmfs/writer.rs +49 -0
  488. data/core/src/services/koofr/backend.rs +361 -0
  489. data/core/src/services/koofr/config.rs +50 -0
  490. data/core/src/services/koofr/core.rs +458 -0
  491. data/core/src/services/koofr/delete.rs +50 -0
  492. data/core/src/services/koofr/docs.md +51 -0
  493. data/core/src/services/koofr/error.rs +72 -0
  494. data/core/src/services/koofr/lister.rs +88 -0
  495. data/core/src/services/koofr/mod.rs +38 -0
  496. data/core/src/services/koofr/writer.rs +53 -0
  497. data/core/src/services/lakefs/backend.rs +309 -0
  498. data/core/src/services/lakefs/config.rs +81 -0
  499. data/core/src/services/lakefs/core.rs +261 -0
  500. data/core/src/services/lakefs/delete.rs +54 -0
  501. data/core/src/services/lakefs/docs.md +62 -0
  502. data/core/src/services/lakefs/error.rs +93 -0
  503. data/core/src/services/lakefs/lister.rs +120 -0
  504. data/core/src/services/lakefs/mod.rs +38 -0
  505. data/core/src/services/lakefs/writer.rs +50 -0
  506. data/core/src/services/memcached/backend.rs +284 -0
  507. data/core/src/services/memcached/binary.rs +289 -0
  508. data/core/src/services/memcached/config.rs +43 -0
  509. data/core/src/services/memcached/docs.md +47 -0
  510. data/core/src/services/memcached/mod.rs +27 -0
  511. data/core/src/services/memory/backend.rs +205 -0
  512. data/core/src/services/memory/config.rs +30 -0
  513. data/core/src/services/memory/core.rs +80 -0
  514. data/core/src/services/memory/delete.rs +42 -0
  515. data/core/src/services/memory/docs.md +36 -0
  516. data/core/src/services/memory/lister.rs +56 -0
  517. data/core/src/services/memory/mod.rs +36 -0
  518. data/core/src/services/memory/writer.rs +85 -0
  519. data/core/src/services/mini_moka/backend.rs +260 -0
  520. data/core/src/services/mini_moka/config.rs +56 -0
  521. data/core/src/services/mini_moka/core.rs +52 -0
  522. data/core/src/services/mini_moka/delete.rs +42 -0
  523. data/core/src/services/mini_moka/docs.md +19 -0
  524. data/core/src/services/mini_moka/lister.rs +68 -0
  525. data/core/src/services/mini_moka/mod.rs +36 -0
  526. data/core/src/services/mini_moka/writer.rs +84 -0
  527. data/core/src/services/mod.rs +206 -0
  528. data/core/src/services/moka/backend.rs +326 -0
  529. data/core/src/services/moka/config.rs +59 -0
  530. data/core/src/services/moka/core.rs +62 -0
  531. data/core/src/services/moka/delete.rs +42 -0
  532. data/core/src/services/moka/docs.md +42 -0
  533. data/core/src/services/moka/lister.rs +65 -0
  534. data/core/src/services/moka/mod.rs +41 -0
  535. data/core/src/services/moka/writer.rs +83 -0
  536. data/core/src/services/mongodb/backend.rs +291 -0
  537. data/core/src/services/mongodb/config.rs +54 -0
  538. data/core/src/services/mongodb/docs.md +49 -0
  539. data/core/src/services/mongodb/mod.rs +24 -0
  540. data/core/src/services/monoiofs/backend.rs +238 -0
  541. data/core/src/services/monoiofs/config.rs +34 -0
  542. data/core/src/services/monoiofs/core.rs +313 -0
  543. data/core/src/services/monoiofs/delete.rs +64 -0
  544. data/core/src/services/monoiofs/docs.md +46 -0
  545. data/core/src/services/monoiofs/mod.rs +36 -0
  546. data/core/src/services/monoiofs/reader.rs +147 -0
  547. data/core/src/services/monoiofs/writer.rs +189 -0
  548. data/core/src/services/mysql/backend.rs +256 -0
  549. data/core/src/services/mysql/config.rs +66 -0
  550. data/core/src/services/mysql/docs.md +47 -0
  551. data/core/src/services/mysql/mod.rs +24 -0
  552. data/core/src/services/obs/backend.rs +442 -0
  553. data/core/src/services/obs/config.rs +53 -0
  554. data/core/src/services/obs/core.rs +608 -0
  555. data/core/src/services/obs/delete.rs +48 -0
  556. data/core/src/services/obs/docs.md +54 -0
  557. data/core/src/services/obs/error.rs +106 -0
  558. data/core/src/services/obs/lister.rs +101 -0
  559. data/core/src/services/obs/mod.rs +38 -0
  560. data/core/src/services/obs/writer.rs +235 -0
  561. data/core/src/services/onedrive/backend.rs +127 -0
  562. data/core/src/services/onedrive/builder.rs +236 -0
  563. data/core/src/services/onedrive/config.rs +49 -0
  564. data/core/src/services/onedrive/core.rs +691 -0
  565. data/core/src/services/onedrive/delete.rs +47 -0
  566. data/core/src/services/onedrive/docs.md +115 -0
  567. data/core/src/services/onedrive/error.rs +61 -0
  568. data/core/src/services/onedrive/graph_model.rs +425 -0
  569. data/core/src/services/onedrive/lister.rs +150 -0
  570. data/core/src/services/onedrive/mod.rs +42 -0
  571. data/core/src/services/onedrive/writer.rs +168 -0
  572. data/core/src/services/opfs/backend.rs +50 -0
  573. data/core/src/services/opfs/config.rs +25 -0
  574. data/core/src/services/opfs/core.rs +74 -0
  575. data/core/src/services/opfs/docs.md +18 -0
  576. data/core/src/services/opfs/error.rs +27 -0
  577. data/core/src/services/opfs/mod.rs +30 -0
  578. data/core/src/services/opfs/utils.rs +70 -0
  579. data/core/src/services/oss/backend.rs +734 -0
  580. data/core/src/services/oss/config.rs +113 -0
  581. data/core/src/services/oss/core.rs +1088 -0
  582. data/core/src/services/oss/delete.rs +109 -0
  583. data/core/src/services/oss/docs.md +74 -0
  584. data/core/src/services/oss/error.rs +109 -0
  585. data/core/src/services/oss/lister.rs +256 -0
  586. data/core/src/services/oss/mod.rs +38 -0
  587. data/core/src/services/oss/writer.rs +228 -0
  588. data/core/src/services/pcloud/backend.rs +358 -0
  589. data/core/src/services/pcloud/config.rs +51 -0
  590. data/core/src/services/pcloud/core.rs +461 -0
  591. data/core/src/services/pcloud/delete.rs +66 -0
  592. data/core/src/services/pcloud/docs.md +51 -0
  593. data/core/src/services/pcloud/error.rs +88 -0
  594. data/core/src/services/pcloud/lister.rs +95 -0
  595. data/core/src/services/pcloud/mod.rs +38 -0
  596. data/core/src/services/pcloud/writer.rs +66 -0
  597. data/core/src/services/persy/backend.rs +226 -0
  598. data/core/src/services/persy/config.rs +32 -0
  599. data/core/src/services/persy/docs.md +43 -0
  600. data/core/src/services/persy/mod.rs +24 -0
  601. data/core/src/services/postgresql/backend.rs +258 -0
  602. data/core/src/services/postgresql/config.rs +66 -0
  603. data/core/src/services/postgresql/docs.md +47 -0
  604. data/core/src/services/postgresql/mod.rs +24 -0
  605. data/core/src/services/redb/backend.rs +280 -0
  606. data/core/src/services/redb/config.rs +34 -0
  607. data/core/src/services/redb/docs.md +41 -0
  608. data/core/src/services/redb/mod.rs +24 -0
  609. data/core/src/services/redis/backend.rs +442 -0
  610. data/core/src/services/redis/config.rs +79 -0
  611. data/core/src/services/redis/core.rs +209 -0
  612. data/core/src/services/redis/delete.rs +40 -0
  613. data/core/src/services/redis/docs.md +43 -0
  614. data/core/src/services/redis/mod.rs +34 -0
  615. data/core/src/services/redis/writer.rs +57 -0
  616. data/core/src/services/rocksdb/backend.rs +159 -0
  617. data/core/src/services/rocksdb/config.rs +34 -0
  618. data/core/src/services/rocksdb/docs.md +54 -0
  619. data/core/src/services/rocksdb/mod.rs +24 -0
  620. data/core/src/services/s3/backend.rs +1293 -0
  621. data/core/src/services/s3/compatible_services.md +126 -0
  622. data/core/src/services/s3/config.rs +327 -0
  623. data/core/src/services/s3/core.rs +1741 -0
  624. data/core/src/services/s3/delete.rs +109 -0
  625. data/core/src/services/s3/docs.md +244 -0
  626. data/core/src/services/s3/error.rs +171 -0
  627. data/core/src/services/s3/lister.rs +405 -0
  628. data/core/src/services/s3/mod.rs +38 -0
  629. data/core/src/services/s3/writer.rs +262 -0
  630. data/core/src/services/seafile/backend.rs +297 -0
  631. data/core/src/services/seafile/config.rs +56 -0
  632. data/core/src/services/seafile/core.rs +475 -0
  633. data/core/src/services/seafile/delete.rs +40 -0
  634. data/core/src/services/seafile/docs.md +54 -0
  635. data/core/src/services/seafile/error.rs +86 -0
  636. data/core/src/services/seafile/lister.rs +83 -0
  637. data/core/src/services/seafile/mod.rs +38 -0
  638. data/core/src/services/seafile/writer.rs +55 -0
  639. data/core/src/services/sftp/backend.rs +397 -0
  640. data/core/src/services/sftp/config.rs +50 -0
  641. data/core/src/services/sftp/core.rs +154 -0
  642. data/core/src/services/sftp/delete.rs +55 -0
  643. data/core/src/services/sftp/docs.md +49 -0
  644. data/core/src/services/sftp/error.rs +57 -0
  645. data/core/src/services/sftp/lister.rs +88 -0
  646. data/core/src/services/sftp/mod.rs +42 -0
  647. data/core/src/services/sftp/reader.rs +78 -0
  648. data/core/src/services/sftp/utils.rs +51 -0
  649. data/core/src/services/sftp/writer.rs +67 -0
  650. data/core/src/services/sled/backend.rs +194 -0
  651. data/core/src/services/sled/config.rs +45 -0
  652. data/core/src/services/sled/docs.md +39 -0
  653. data/core/src/services/sled/mod.rs +24 -0
  654. data/core/src/services/sqlite/backend.rs +326 -0
  655. data/core/src/services/sqlite/config.rs +70 -0
  656. data/core/src/services/sqlite/docs.md +46 -0
  657. data/core/src/services/sqlite/mod.rs +24 -0
  658. data/core/src/services/surrealdb/backend.rs +365 -0
  659. data/core/src/services/surrealdb/config.rs +64 -0
  660. data/core/src/services/surrealdb/docs.md +54 -0
  661. data/core/src/services/surrealdb/mod.rs +24 -0
  662. data/core/src/services/swift/backend.rs +275 -0
  663. data/core/src/services/swift/compatible_services.md +53 -0
  664. data/core/src/services/swift/config.rs +53 -0
  665. data/core/src/services/swift/core.rs +310 -0
  666. data/core/src/services/swift/delete.rs +49 -0
  667. data/core/src/services/swift/docs.md +52 -0
  668. data/core/src/services/swift/error.rs +90 -0
  669. data/core/src/services/swift/lister.rs +119 -0
  670. data/core/src/services/swift/mod.rs +38 -0
  671. data/core/src/services/swift/writer.rs +53 -0
  672. data/core/src/services/tikv/backend.rs +237 -0
  673. data/core/src/services/tikv/config.rs +52 -0
  674. data/core/src/services/tikv/docs.md +43 -0
  675. data/core/src/services/tikv/mod.rs +24 -0
  676. data/core/src/services/upyun/backend.rs +317 -0
  677. data/core/src/services/upyun/config.rs +51 -0
  678. data/core/src/services/upyun/core.rs +521 -0
  679. data/core/src/services/upyun/delete.rs +50 -0
  680. data/core/src/services/upyun/docs.md +51 -0
  681. data/core/src/services/upyun/error.rs +97 -0
  682. data/core/src/services/upyun/lister.rs +101 -0
  683. data/core/src/services/upyun/mod.rs +38 -0
  684. data/core/src/services/upyun/writer.rs +127 -0
  685. data/core/src/services/vercel_artifacts/backend.rs +99 -0
  686. data/core/src/services/vercel_artifacts/builder.rs +117 -0
  687. data/core/src/services/vercel_artifacts/config.rs +39 -0
  688. data/core/src/services/vercel_artifacts/core.rs +112 -0
  689. data/core/src/services/vercel_artifacts/docs.md +40 -0
  690. data/core/src/services/vercel_artifacts/error.rs +50 -0
  691. data/core/src/services/vercel_artifacts/mod.rs +36 -0
  692. data/core/src/services/vercel_artifacts/writer.rs +58 -0
  693. data/core/src/services/vercel_blob/backend.rs +251 -0
  694. data/core/src/services/vercel_blob/config.rs +45 -0
  695. data/core/src/services/vercel_blob/core.rs +449 -0
  696. data/core/src/services/vercel_blob/delete.rs +38 -0
  697. data/core/src/services/vercel_blob/docs.md +45 -0
  698. data/core/src/services/vercel_blob/error.rs +110 -0
  699. data/core/src/services/vercel_blob/lister.rs +69 -0
  700. data/core/src/services/vercel_blob/mod.rs +38 -0
  701. data/core/src/services/vercel_blob/writer.rs +143 -0
  702. data/core/src/services/webdav/backend.rs +318 -0
  703. data/core/src/services/webdav/config.rs +53 -0
  704. data/core/src/services/webdav/core.rs +859 -0
  705. data/core/src/services/webdav/delete.rs +47 -0
  706. data/core/src/services/webdav/docs.md +49 -0
  707. data/core/src/services/webdav/error.rs +53 -0
  708. data/core/src/services/webdav/lister.rs +106 -0
  709. data/core/src/services/webdav/mod.rs +38 -0
  710. data/core/src/services/webdav/writer.rs +56 -0
  711. data/core/src/services/webhdfs/backend.rs +376 -0
  712. data/core/src/services/webhdfs/config.rs +52 -0
  713. data/core/src/services/webhdfs/core.rs +398 -0
  714. data/core/src/services/webhdfs/delete.rs +46 -0
  715. data/core/src/services/webhdfs/docs.md +90 -0
  716. data/core/src/services/webhdfs/error.rs +126 -0
  717. data/core/src/services/webhdfs/lister.rs +130 -0
  718. data/core/src/services/webhdfs/message.rs +249 -0
  719. data/core/src/services/webhdfs/mod.rs +41 -0
  720. data/core/src/services/webhdfs/writer.rs +177 -0
  721. data/core/src/services/yandex_disk/backend.rs +267 -0
  722. data/core/src/services/yandex_disk/config.rs +45 -0
  723. data/core/src/services/yandex_disk/core.rs +340 -0
  724. data/core/src/services/yandex_disk/delete.rs +54 -0
  725. data/core/src/services/yandex_disk/docs.md +45 -0
  726. data/core/src/services/yandex_disk/error.rs +104 -0
  727. data/core/src/services/yandex_disk/lister.rs +113 -0
  728. data/core/src/services/yandex_disk/mod.rs +38 -0
  729. data/core/src/services/yandex_disk/writer.rs +52 -0
  730. data/core/src/types/buffer.rs +991 -0
  731. data/core/src/types/builder.rs +152 -0
  732. data/core/src/types/capability.rs +209 -0
  733. data/core/src/types/context/mod.rs +22 -0
  734. data/core/src/types/context/read.rs +231 -0
  735. data/core/src/types/context/write.rs +441 -0
  736. data/core/src/types/delete/deleter.rs +220 -0
  737. data/core/src/types/delete/futures_delete_sink.rs +176 -0
  738. data/core/src/types/delete/input.rs +97 -0
  739. data/core/src/types/delete/mod.rs +26 -0
  740. data/core/src/types/entry.rs +69 -0
  741. data/core/src/types/error.rs +570 -0
  742. data/core/src/types/execute/api.rs +110 -0
  743. data/core/src/types/execute/executor.rs +96 -0
  744. data/core/src/types/execute/executors/mod.rs +27 -0
  745. data/core/src/types/execute/executors/tokio_executor.rs +60 -0
  746. data/core/src/types/execute/mod.rs +25 -0
  747. data/core/src/types/list.rs +137 -0
  748. data/core/src/types/metadata.rs +436 -0
  749. data/core/src/types/mod.rs +72 -0
  750. data/core/src/types/mode.rs +68 -0
  751. data/core/src/types/operator/builder.rs +535 -0
  752. data/core/src/types/operator/info.rs +63 -0
  753. data/core/src/types/operator/mod.rs +33 -0
  754. data/core/src/types/operator/operator.rs +2236 -0
  755. data/core/src/types/operator/operator_futures.rs +1430 -0
  756. data/core/src/types/operator/registry.rs +129 -0
  757. data/core/src/types/options.rs +548 -0
  758. data/core/src/types/read/buffer_stream.rs +273 -0
  759. data/core/src/types/read/futures_async_reader.rs +289 -0
  760. data/core/src/types/read/futures_bytes_stream.rs +157 -0
  761. data/core/src/types/read/mod.rs +29 -0
  762. data/core/src/types/read/reader.rs +604 -0
  763. data/core/src/types/scheme.rs +475 -0
  764. data/core/src/types/write/buffer_sink.rs +188 -0
  765. data/core/src/types/write/futures_async_writer.rs +136 -0
  766. data/core/src/types/write/futures_bytes_sink.rs +103 -0
  767. data/core/src/types/write/mod.rs +26 -0
  768. data/core/src/types/write/writer.rs +411 -0
  769. data/core/tests/behavior/README.md +77 -0
  770. data/core/tests/behavior/async_copy.rs +314 -0
  771. data/core/tests/behavior/async_create_dir.rs +53 -0
  772. data/core/tests/behavior/async_delete.rs +354 -0
  773. data/core/tests/behavior/async_list.rs +739 -0
  774. data/core/tests/behavior/async_presign.rs +175 -0
  775. data/core/tests/behavior/async_read.rs +871 -0
  776. data/core/tests/behavior/async_rename.rs +210 -0
  777. data/core/tests/behavior/async_stat.rs +628 -0
  778. data/core/tests/behavior/async_write.rs +819 -0
  779. data/core/tests/behavior/main.rs +78 -0
  780. data/core/tests/behavior/utils.rs +187 -0
  781. data/core/tests/data/normal_dir/.gitkeep +0 -0
  782. data/core/tests/data/normal_file.txt +1041 -0
  783. data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
  784. data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
  785. data/core/users.md +13 -0
  786. data/extconf.rb +24 -0
  787. data/lib/opendal.rb +25 -0
  788. data/lib/opendal_ruby/entry.rb +35 -0
  789. data/lib/opendal_ruby/io.rb +70 -0
  790. data/lib/opendal_ruby/metadata.rb +44 -0
  791. data/lib/opendal_ruby/operator.rb +29 -0
  792. data/lib/opendal_ruby/operator_info.rb +26 -0
  793. data/src/capability.rs +146 -0
  794. data/src/io.rs +464 -0
  795. data/src/lib.rs +63 -0
  796. data/src/lister.rs +141 -0
  797. data/src/metadata.rs +111 -0
  798. data/src/middlewares.rs +174 -0
  799. data/src/operator.rs +310 -0
  800. data/src/operator_info.rs +83 -0
  801. data/test/blocking_op_test.rb +112 -0
  802. data/test/capability_test.rb +42 -0
  803. data/test/io_test.rb +172 -0
  804. data/test/lister_test.rb +77 -0
  805. data/test/metadata_test.rb +78 -0
  806. data/test/middlewares_test.rb +46 -0
  807. data/test/operator_info_test.rb +35 -0
  808. data/test/test_helper.rb +36 -0
  809. metadata +857 -0
@@ -0,0 +1,729 @@
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 tokio::runtime::Handle;
19
+
20
+ use crate::Operator as AsyncOperator;
21
+ use crate::*;
22
+
23
+ /// Use OpenDAL in blocking context.
24
+ ///
25
+ /// # Notes
26
+ ///
27
+ /// blocking::Operator is a wrapper around [`AsyncOperator`]. It calls async runtimes' `block_on` API to spawn blocking tasks.
28
+ /// Please avoid using blocking::Operator in async context.
29
+ ///
30
+ /// # Examples
31
+ ///
32
+ /// ## Init in async context
33
+ ///
34
+ /// blocking::Operator will use current async context's runtime to handle the async calls.
35
+ ///
36
+ /// This is just for initialization. You must use `blocking::Operator` in blocking context.
37
+ ///
38
+ /// ```rust,no_run
39
+ /// # use opendal::services;
40
+ /// # use opendal::blocking;
41
+ /// # use opendal::Operator;
42
+ /// # use opendal::Result;
43
+ ///
44
+ /// #[tokio::main]
45
+ /// async fn main() -> Result<()> {
46
+ /// // Create fs backend builder.
47
+ /// let mut builder = services::S3::default().bucket("test").region("us-east-1");
48
+ /// let op = Operator::new(builder)?.finish();
49
+ ///
50
+ /// // Build an `blocking::Operator` with blocking layer to start operating the storage.
51
+ /// let _: blocking::Operator = blocking::Operator::new(op)?;
52
+ ///
53
+ /// Ok(())
54
+ /// }
55
+ /// ```
56
+ ///
57
+ /// ## In async context with blocking functions
58
+ ///
59
+ /// If `blocking::Operator` is called in blocking function, please fetch a [`tokio::runtime::EnterGuard`]
60
+ /// first. You can use [`Handle::try_current`] first to get the handle and then call [`Handle::enter`].
61
+ /// This often happens in the case that async function calls blocking function.
62
+ ///
63
+ /// ```rust,no_run
64
+ /// # use opendal::services;
65
+ /// # use opendal::blocking;
66
+ /// # use opendal::Operator;
67
+ /// # use opendal::Result;
68
+ ///
69
+ /// #[tokio::main]
70
+ /// async fn main() -> Result<()> {
71
+ /// let _ = blocking_fn()?;
72
+ /// Ok(())
73
+ /// }
74
+ ///
75
+ /// fn blocking_fn() -> Result<blocking::Operator> {
76
+ /// // Create fs backend builder.
77
+ /// let mut builder = services::S3::default().bucket("test").region("us-east-1");
78
+ /// let op = Operator::new(builder)?.finish();
79
+ ///
80
+ /// let handle = tokio::runtime::Handle::try_current().unwrap();
81
+ /// let _guard = handle.enter();
82
+ /// // Build an `blocking::Operator` to start operating the storage.
83
+ /// let op: blocking::Operator = blocking::Operator::new(op)?;
84
+ /// Ok(op)
85
+ /// }
86
+ /// ```
87
+ ///
88
+ /// ## In blocking context
89
+ ///
90
+ /// In a pure blocking context, we can create a runtime and use it to create the `blocking::Operator`.
91
+ ///
92
+ /// > The following code uses a global statically created runtime as an example, please manage the
93
+ /// > runtime on demand.
94
+ ///
95
+ /// ```rust,no_run
96
+ /// # use std::sync::LazyLock;
97
+ /// # use opendal::services;
98
+ /// # use opendal::blocking;
99
+ /// # use opendal::Operator;
100
+ /// # use opendal::Result;
101
+ ///
102
+ /// static RUNTIME: LazyLock<tokio::runtime::Runtime> = LazyLock::new(|| {
103
+ /// tokio::runtime::Builder::new_multi_thread()
104
+ /// .enable_all()
105
+ /// .build()
106
+ /// .unwrap()
107
+ /// });
108
+ ///
109
+ /// fn main() -> Result<()> {
110
+ /// // Create fs backend builder.
111
+ /// let mut builder = services::S3::default().bucket("test").region("us-east-1");
112
+ /// let op = Operator::new(builder)?.finish();
113
+ ///
114
+ /// // Fetch the `EnterGuard` from global runtime.
115
+ /// let _guard = RUNTIME.enter();
116
+ /// // Build an `blocking::Operator` with blocking layer to start operating the storage.
117
+ /// let _: blocking::Operator = blocking::Operator::new(op)?;
118
+ ///
119
+ /// Ok(())
120
+ /// }
121
+ /// ```
122
+ #[derive(Clone, Debug)]
123
+ pub struct Operator {
124
+ handle: tokio::runtime::Handle,
125
+ op: AsyncOperator,
126
+ }
127
+
128
+ impl Operator {
129
+ /// Create a new `BlockingLayer` with the current runtime's handle
130
+ pub fn new(op: AsyncOperator) -> Result<Self> {
131
+ Ok(Self {
132
+ handle: Handle::try_current()
133
+ .map_err(|_| Error::new(ErrorKind::Unexpected, "failed to get current handle"))?,
134
+ op,
135
+ })
136
+ }
137
+
138
+ /// Create a blocking operator from URI based configuration.
139
+ pub fn from_uri(
140
+ uri: &str,
141
+ options: impl IntoIterator<Item = (String, String)>,
142
+ ) -> Result<Self> {
143
+ let op = AsyncOperator::from_uri(uri, options)?;
144
+ Self::new(op)
145
+ }
146
+
147
+ /// Get information of underlying accessor.
148
+ ///
149
+ /// # Examples
150
+ ///
151
+ /// ```
152
+ /// # use std::sync::Arc;
153
+ /// use opendal::blocking;
154
+ /// # use anyhow::Result;
155
+ /// use opendal::blocking::Operator;
156
+ ///
157
+ /// # fn test(op: blocking::Operator) -> Result<()> {
158
+ /// let info = op.info();
159
+ /// # Ok(())
160
+ /// # }
161
+ /// ```
162
+ pub fn info(&self) -> OperatorInfo {
163
+ self.op.info()
164
+ }
165
+ }
166
+
167
+ /// # Operator blocking API.
168
+ impl Operator {
169
+ /// Get given path's metadata.
170
+ ///
171
+ /// # Behavior
172
+ ///
173
+ /// ## Services that support `create_dir`
174
+ ///
175
+ /// `test` and `test/` may vary in some services such as S3. However, on a local file system,
176
+ /// they're identical. Therefore, the behavior of `stat("test")` and `stat("test/")` might differ
177
+ /// in certain edge cases. Always use `stat("test/")` when you need to access a directory if possible.
178
+ ///
179
+ /// Here are the behavior list:
180
+ ///
181
+ /// | Case | Path | Result |
182
+ /// |------------------------|-----------------|--------------------------------------------|
183
+ /// | stat existing dir | `abc/` | Metadata with dir mode |
184
+ /// | stat existing file | `abc/def_file` | Metadata with file mode |
185
+ /// | stat dir without `/` | `abc/def_dir` | Error `NotFound` or metadata with dir mode |
186
+ /// | stat file with `/` | `abc/def_file/` | Error `NotFound` |
187
+ /// | stat not existing path | `xyz` | Error `NotFound` |
188
+ ///
189
+ /// Refer to [RFC: List Prefix][crate::docs::rfcs::rfc_3243_list_prefix] for more details.
190
+ ///
191
+ /// ## Services that not support `create_dir`
192
+ ///
193
+ /// For services that not support `create_dir`, `stat("test/")` will return `NotFound` even
194
+ /// when `test/abc` exists since the service won't have the concept of dir. There is nothing
195
+ /// we can do about this.
196
+ ///
197
+ /// # Examples
198
+ ///
199
+ /// ## Check if file exists
200
+ ///
201
+ /// ```
202
+ /// # use anyhow::Result;
203
+ /// # use futures::io;
204
+ /// use opendal::blocking;
205
+ /// # use opendal::blocking::Operator;
206
+ /// use opendal::ErrorKind;
207
+ /// #
208
+ /// # fn test(op: blocking::Operator) -> Result<()> {
209
+ /// if let Err(e) = op.stat("test") {
210
+ /// if e.kind() == ErrorKind::NotFound {
211
+ /// println!("file not exist")
212
+ /// }
213
+ /// }
214
+ /// # Ok(())
215
+ /// # }
216
+ /// ```
217
+ pub fn stat(&self, path: &str) -> Result<Metadata> {
218
+ self.stat_options(path, options::StatOptions::default())
219
+ }
220
+
221
+ /// Get given path's metadata with extra options.
222
+ ///
223
+ /// # Behavior
224
+ ///
225
+ /// ## Services that support `create_dir`
226
+ ///
227
+ /// `test` and `test/` may vary in some services such as S3. However, on a local file system,
228
+ /// they're identical. Therefore, the behavior of `stat("test")` and `stat("test/")` might differ
229
+ /// in certain edge cases. Always use `stat("test/")` when you need to access a directory if possible.
230
+ ///
231
+ /// Here are the behavior list:
232
+ ///
233
+ /// | Case | Path | Result |
234
+ /// |------------------------|-----------------|--------------------------------------------|
235
+ /// | stat existing dir | `abc/` | Metadata with dir mode |
236
+ /// | stat existing file | `abc/def_file` | Metadata with file mode |
237
+ /// | stat dir without `/` | `abc/def_dir` | Error `NotFound` or metadata with dir mode |
238
+ /// | stat file with `/` | `abc/def_file/` | Error `NotFound` |
239
+ /// | stat not existing path | `xyz` | Error `NotFound` |
240
+ ///
241
+ /// Refer to [RFC: List Prefix][crate::docs::rfcs::rfc_3243_list_prefix] for more details.
242
+ ///
243
+ /// ## Services that not support `create_dir`
244
+ ///
245
+ /// For services that not support `create_dir`, `stat("test/")` will return `NotFound` even
246
+ /// when `test/abc` exists since the service won't have the concept of dir. There is nothing
247
+ /// we can do about this.
248
+ pub fn stat_options(&self, path: &str, opts: options::StatOptions) -> Result<Metadata> {
249
+ self.handle.block_on(self.op.stat_options(path, opts))
250
+ }
251
+
252
+ /// Check if this path exists or not.
253
+ ///
254
+ /// # Example
255
+ ///
256
+ /// ```no_run
257
+ /// use anyhow::Result;
258
+ /// use opendal::blocking;
259
+ /// use opendal::blocking::Operator;
260
+ /// fn test(op: blocking::Operator) -> Result<()> {
261
+ /// let _ = op.exists("test")?;
262
+ ///
263
+ /// Ok(())
264
+ /// }
265
+ /// ```
266
+ pub fn exists(&self, path: &str) -> Result<bool> {
267
+ let r = self.stat(path);
268
+ match r {
269
+ Ok(_) => Ok(true),
270
+ Err(err) => match err.kind() {
271
+ ErrorKind::NotFound => Ok(false),
272
+ _ => Err(err),
273
+ },
274
+ }
275
+ }
276
+
277
+ /// Create a dir at given path.
278
+ ///
279
+ /// # Notes
280
+ ///
281
+ /// To indicate that a path is a directory, it is compulsory to include
282
+ /// a trailing / in the path. Failure to do so may result in
283
+ /// `NotADirectory` error being returned by OpenDAL.
284
+ ///
285
+ /// # Behavior
286
+ ///
287
+ /// - Create on existing dir will succeed.
288
+ /// - Create dir is always recursive, works like `mkdir -p`
289
+ ///
290
+ /// # Examples
291
+ ///
292
+ /// ```no_run
293
+ /// # use opendal::Result;
294
+ /// use opendal::blocking;
295
+ /// # use opendal::blocking::Operator;
296
+ /// # use futures::TryStreamExt;
297
+ /// # fn test(op: blocking::Operator) -> Result<()> {
298
+ /// op.create_dir("path/to/dir/")?;
299
+ /// # Ok(())
300
+ /// # }
301
+ /// ```
302
+ pub fn create_dir(&self, path: &str) -> Result<()> {
303
+ self.handle.block_on(self.op.create_dir(path))
304
+ }
305
+
306
+ /// Read the whole path into a bytes.
307
+ ///
308
+ /// This function will allocate a new bytes internally. For more precise memory control or
309
+ /// reading data lazily, please use [`blocking::Operator::reader`]
310
+ ///
311
+ /// # Examples
312
+ ///
313
+ /// ```no_run
314
+ /// # use opendal::Result;
315
+ /// use opendal::blocking;
316
+ /// # use opendal::blocking::Operator;
317
+ /// #
318
+ /// # fn test(op: blocking::Operator) -> Result<()> {
319
+ /// let bs = op.read("path/to/file")?;
320
+ /// # Ok(())
321
+ /// # }
322
+ /// ```
323
+ pub fn read(&self, path: &str) -> Result<Buffer> {
324
+ self.read_options(path, options::ReadOptions::default())
325
+ }
326
+
327
+ /// Read the whole path into a bytes with extra options.
328
+ ///
329
+ /// This function will allocate a new bytes internally. For more precise memory control or
330
+ /// reading data lazily, please use [`blocking::Operator::reader`]
331
+ pub fn read_options(&self, path: &str, opts: options::ReadOptions) -> Result<Buffer> {
332
+ self.handle.block_on(self.op.read_options(path, opts))
333
+ }
334
+
335
+ /// Create a new reader which can read the whole path.
336
+ ///
337
+ /// # Examples
338
+ ///
339
+ /// ```no_run
340
+ /// # use opendal::Result;
341
+ /// use opendal::blocking;
342
+ /// # use opendal::blocking::Operator;
343
+ /// # use futures::TryStreamExt;
344
+ /// # fn test(op: blocking::Operator) -> Result<()> {
345
+ /// let r = op.reader("path/to/file")?;
346
+ /// # Ok(())
347
+ /// # }
348
+ /// ```
349
+ pub fn reader(&self, path: &str) -> Result<blocking::Reader> {
350
+ self.reader_options(path, options::ReaderOptions::default())
351
+ }
352
+
353
+ /// Create a new reader with extra options
354
+ pub fn reader_options(
355
+ &self,
356
+ path: &str,
357
+ opts: options::ReaderOptions,
358
+ ) -> Result<blocking::Reader> {
359
+ let r = self.handle.block_on(self.op.reader_options(path, opts))?;
360
+ Ok(blocking::Reader::new(self.handle.clone(), r))
361
+ }
362
+
363
+ /// Write bytes into given path.
364
+ ///
365
+ /// # Notes
366
+ ///
367
+ /// - Write will make sure all bytes has been written, or an error will be returned.
368
+ ///
369
+ /// # Examples
370
+ ///
371
+ /// ```no_run
372
+ /// # use opendal::Result;
373
+ /// # use opendal::blocking::Operator;
374
+ /// # use futures::StreamExt;
375
+ /// # use futures::SinkExt;
376
+ /// use bytes::Bytes;
377
+ /// use opendal::blocking;
378
+ ///
379
+ /// # fn test(op: blocking::Operator) -> Result<()> {
380
+ /// op.write("path/to/file", vec![0; 4096])?;
381
+ /// # Ok(())
382
+ /// # }
383
+ /// ```
384
+ pub fn write(&self, path: &str, bs: impl Into<Buffer>) -> Result<Metadata> {
385
+ self.write_options(path, bs, options::WriteOptions::default())
386
+ }
387
+
388
+ /// Write data with options.
389
+ ///
390
+ /// # Notes
391
+ ///
392
+ /// - Write will make sure all bytes has been written, or an error will be returned.
393
+ pub fn write_options(
394
+ &self,
395
+ path: &str,
396
+ bs: impl Into<Buffer>,
397
+ opts: options::WriteOptions,
398
+ ) -> Result<Metadata> {
399
+ self.handle.block_on(self.op.write_options(path, bs, opts))
400
+ }
401
+
402
+ /// Write multiple bytes into given path.
403
+ ///
404
+ /// # Notes
405
+ ///
406
+ /// - Write will make sure all bytes has been written, or an error will be returned.
407
+ ///
408
+ /// # Examples
409
+ ///
410
+ /// ```no_run
411
+ /// # use opendal::Result;
412
+ /// # use opendal::blocking;
413
+ /// # use opendal::blocking::Operator;
414
+ /// # use futures::StreamExt;
415
+ /// # use futures::SinkExt;
416
+ /// use bytes::Bytes;
417
+ ///
418
+ /// # fn test(op: blocking::Operator) -> Result<()> {
419
+ /// let mut w = op.writer("path/to/file")?;
420
+ /// w.write(vec![0; 4096])?;
421
+ /// w.write(vec![1; 4096])?;
422
+ /// w.close()?;
423
+ /// # Ok(())
424
+ /// # }
425
+ /// ```
426
+ pub fn writer(&self, path: &str) -> Result<blocking::Writer> {
427
+ self.writer_options(path, options::WriteOptions::default())
428
+ }
429
+
430
+ /// Create a new writer with extra options
431
+ pub fn writer_options(
432
+ &self,
433
+ path: &str,
434
+ opts: options::WriteOptions,
435
+ ) -> Result<blocking::Writer> {
436
+ let w = self.handle.block_on(self.op.writer_options(path, opts))?;
437
+ Ok(blocking::Writer::new(self.handle.clone(), w))
438
+ }
439
+
440
+ /// Copy a file from `from` to `to`.
441
+ ///
442
+ /// # Notes
443
+ ///
444
+ /// - `from` and `to` must be a file.
445
+ /// - `to` will be overwritten if it exists.
446
+ /// - If `from` and `to` are the same, nothing will happen.
447
+ /// - `copy` is idempotent. For same `from` and `to` input, the result will be the same.
448
+ ///
449
+ /// # Examples
450
+ ///
451
+ /// ```
452
+ /// # use opendal::Result;
453
+ /// use opendal::blocking;
454
+ /// # use opendal::blocking::Operator;
455
+ ///
456
+ /// # fn test(op: blocking::Operator) -> Result<()> {
457
+ /// op.copy("path/to/file", "path/to/file2")?;
458
+ /// # Ok(())
459
+ /// # }
460
+ /// ```
461
+ pub fn copy(&self, from: &str, to: &str) -> Result<()> {
462
+ self.handle.block_on(self.op.copy(from, to))
463
+ }
464
+
465
+ /// Rename a file from `from` to `to`.
466
+ ///
467
+ /// # Notes
468
+ ///
469
+ /// - `from` and `to` must be a file.
470
+ /// - `to` will be overwritten if it exists.
471
+ /// - If `from` and `to` are the same, a `IsSameFile` error will occur.
472
+ ///
473
+ /// # Examples
474
+ ///
475
+ /// ```
476
+ /// # use opendal::Result;
477
+ /// use opendal::blocking;
478
+ /// # use opendal::blocking::Operator;
479
+ ///
480
+ /// # fn test(op: blocking::Operator) -> Result<()> {
481
+ /// op.rename("path/to/file", "path/to/file2")?;
482
+ /// # Ok(())
483
+ /// # }
484
+ /// ```
485
+ pub fn rename(&self, from: &str, to: &str) -> Result<()> {
486
+ self.handle.block_on(self.op.rename(from, to))
487
+ }
488
+
489
+ /// Delete given path.
490
+ ///
491
+ /// # Notes
492
+ ///
493
+ /// - Delete not existing error won't return errors.
494
+ ///
495
+ /// # Examples
496
+ ///
497
+ /// ```no_run
498
+ /// # use anyhow::Result;
499
+ /// # use futures::io;
500
+ /// use opendal::blocking;
501
+ /// # use opendal::blocking::Operator;
502
+ /// # fn test(op: blocking::Operator) -> Result<()> {
503
+ /// op.delete("path/to/file")?;
504
+ /// # Ok(())
505
+ /// # }
506
+ /// ```
507
+ pub fn delete(&self, path: &str) -> Result<()> {
508
+ self.delete_options(path, options::DeleteOptions::default())
509
+ }
510
+
511
+ /// Delete given path with options.
512
+ ///
513
+ /// # Notes
514
+ ///
515
+ /// - Delete not existing error won't return errors.
516
+ pub fn delete_options(&self, path: &str, opts: options::DeleteOptions) -> Result<()> {
517
+ self.handle.block_on(self.op.delete_options(path, opts))
518
+ }
519
+
520
+ /// Delete an infallible iterator of paths.
521
+ ///
522
+ /// Also see:
523
+ ///
524
+ /// - [`blocking::Operator::delete_try_iter`]: delete an fallible iterator of paths.
525
+ pub fn delete_iter<I, D>(&self, iter: I) -> Result<()>
526
+ where
527
+ I: IntoIterator<Item = D>,
528
+ D: IntoDeleteInput,
529
+ {
530
+ self.handle.block_on(self.op.delete_iter(iter))
531
+ }
532
+
533
+ /// Delete a fallible iterator of paths.
534
+ ///
535
+ /// Also see:
536
+ ///
537
+ /// - [`blocking::Operator::delete_iter`]: delete an infallible iterator of paths.
538
+ pub fn delete_try_iter<I, D>(&self, try_iter: I) -> Result<()>
539
+ where
540
+ I: IntoIterator<Item = Result<D>>,
541
+ D: IntoDeleteInput,
542
+ {
543
+ self.handle.block_on(self.op.delete_try_iter(try_iter))
544
+ }
545
+
546
+ /// Create a [`BlockingDeleter`] to continuously remove content from storage.
547
+ ///
548
+ /// It leverages batch deletion capabilities provided by storage services for efficient removal.
549
+ ///
550
+ /// Users can have more control over the deletion process by using [`BlockingDeleter`] directly.
551
+ pub fn deleter(&self) -> Result<blocking::Deleter> {
552
+ blocking::Deleter::create(
553
+ self.handle.clone(),
554
+ self.handle.block_on(self.op.deleter())?,
555
+ )
556
+ }
557
+
558
+ /// Remove the path and all nested dirs and files recursively.
559
+ ///
560
+ /// # Notes
561
+ ///
562
+ /// We don't support batch delete now.
563
+ ///
564
+ /// # Examples
565
+ ///
566
+ /// ```
567
+ /// # use anyhow::Result;
568
+ /// # use futures::io;
569
+ /// use opendal::blocking;
570
+ /// # use opendal::blocking::Operator;
571
+ /// # fn test(op: blocking::Operator) -> Result<()> {
572
+ /// op.remove_all("path/to/dir")?;
573
+ /// # Ok(())
574
+ /// # }
575
+ /// ```
576
+ pub fn remove_all(&self, path: &str) -> Result<()> {
577
+ self.handle.block_on(self.op.remove_all(path))
578
+ }
579
+
580
+ /// List entries that starts with given `path` in parent dir.
581
+ ///
582
+ /// # Notes
583
+ ///
584
+ /// ## Recursively List
585
+ ///
586
+ /// This function only read the children of the given directory. To read
587
+ /// all entries recursively, use `blocking::Operator::list_options("path", opts)`
588
+ /// instead.
589
+ ///
590
+ /// ## Streaming List
591
+ ///
592
+ /// This function will read all entries in the given directory. It could
593
+ /// take very long time and consume a lot of memory if the directory
594
+ /// contains a lot of entries.
595
+ ///
596
+ /// In order to avoid this, you can use [`blocking::Operator::lister`] to list entries in
597
+ /// a streaming way.
598
+ ///
599
+ /// # Examples
600
+ ///
601
+ /// ```no_run
602
+ /// # use anyhow::Result;
603
+ /// use opendal::blocking;
604
+ /// use opendal::blocking::Operator;
605
+ /// use opendal::EntryMode;
606
+ /// # fn test(op: blocking::Operator) -> Result<()> {
607
+ /// let mut entries = op.list("path/to/dir/")?;
608
+ /// for entry in entries {
609
+ /// match entry.metadata().mode() {
610
+ /// EntryMode::FILE => {
611
+ /// println!("Handling file")
612
+ /// }
613
+ /// EntryMode::DIR => {
614
+ /// println!("Handling dir {}", entry.path())
615
+ /// }
616
+ /// EntryMode::Unknown => continue,
617
+ /// }
618
+ /// }
619
+ /// # Ok(())
620
+ /// # }
621
+ /// ```
622
+ pub fn list(&self, path: &str) -> Result<Vec<Entry>> {
623
+ self.list_options(path, options::ListOptions::default())
624
+ }
625
+
626
+ /// List entries that starts with given `path` in parent dir. with options.
627
+ ///
628
+ /// # Notes
629
+ ///
630
+ /// ## Streaming List
631
+ ///
632
+ /// This function will read all entries in the given directory. It could
633
+ /// take very long time and consume a lot of memory if the directory
634
+ /// contains a lot of entries.
635
+ ///
636
+ /// In order to avoid this, you can use [`blocking::Operator::lister`] to list entries in
637
+ /// a streaming way.
638
+ pub fn list_options(&self, path: &str, opts: options::ListOptions) -> Result<Vec<Entry>> {
639
+ self.handle.block_on(self.op.list_options(path, opts))
640
+ }
641
+
642
+ /// List entries that starts with given `path` in parent dir.
643
+ ///
644
+ /// This function will create a new [`BlockingLister`] to list entries. Users can stop listing
645
+ /// via dropping this [`Lister`].
646
+ ///
647
+ /// # Notes
648
+ ///
649
+ /// ## Recursively List
650
+ ///
651
+ /// This function only read the children of the given directory. To read
652
+ /// all entries recursively, use [`blocking::Operator::lister_with`] and `delimiter("")`
653
+ /// instead.
654
+ ///
655
+ /// # Examples
656
+ ///
657
+ /// ```no_run
658
+ /// # use anyhow::Result;
659
+ /// # use futures::io;
660
+ /// use futures::TryStreamExt;
661
+ /// use opendal::blocking;
662
+ /// use opendal::blocking::Operator;
663
+ /// use opendal::EntryMode;
664
+ /// # fn test(op: blocking::Operator) -> Result<()> {
665
+ /// let mut ds = op.lister("path/to/dir/")?;
666
+ /// for de in ds {
667
+ /// let de = de?;
668
+ /// match de.metadata().mode() {
669
+ /// EntryMode::FILE => {
670
+ /// println!("Handling file")
671
+ /// }
672
+ /// EntryMode::DIR => {
673
+ /// println!("Handling dir like start a new list via meta.path()")
674
+ /// }
675
+ /// EntryMode::Unknown => continue,
676
+ /// }
677
+ /// }
678
+ /// # Ok(())
679
+ /// # }
680
+ /// ```
681
+ pub fn lister(&self, path: &str) -> Result<blocking::Lister> {
682
+ self.lister_options(path, options::ListOptions::default())
683
+ }
684
+
685
+ /// List entries within a given directory as an iterator with options.
686
+ ///
687
+ /// This function will create a new handle to list entries.
688
+ ///
689
+ /// An error will be returned if given path doesn't end with `/`.
690
+ pub fn lister_options(
691
+ &self,
692
+ path: &str,
693
+ opts: options::ListOptions,
694
+ ) -> Result<blocking::Lister> {
695
+ let l = self.handle.block_on(self.op.lister_options(path, opts))?;
696
+ Ok(blocking::Lister::new(self.handle.clone(), l))
697
+ }
698
+
699
+ /// Check if this operator can work correctly.
700
+ ///
701
+ /// We will send a `list` request to path and return any errors we met.
702
+ ///
703
+ /// ```
704
+ /// # use std::sync::Arc;
705
+ /// # use anyhow::Result;
706
+ /// use opendal::blocking;
707
+ /// use opendal::blocking::Operator;
708
+ /// use opendal::ErrorKind;
709
+ ///
710
+ /// # fn test(op: blocking::Operator) -> Result<()> {
711
+ /// op.check()?;
712
+ /// # Ok(())
713
+ /// # }
714
+ /// ```
715
+ pub fn check(&self) -> Result<()> {
716
+ let mut ds = self.lister("/")?;
717
+
718
+ match ds.next() {
719
+ Some(Err(e)) if e.kind() != ErrorKind::NotFound => Err(e),
720
+ _ => Ok(()),
721
+ }
722
+ }
723
+ }
724
+
725
+ impl From<Operator> for AsyncOperator {
726
+ fn from(val: Operator) -> Self {
727
+ val.op
728
+ }
729
+ }