This is an automated email from the ASF dual-hosted git repository.
xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
The following commit(s) were added to refs/heads/main by this push:
new b262d4a65 docs: migrate all existed service documents (#2937)
b262d4a65 is described below
commit b262d4a65725dbdeaf1b297712e372c3aff9e59b
Author: Mingzhuo Yin <[email protected]>
AuthorDate: Fri Aug 25 18:44:54 2023 +0800
docs: migrate all existed service documents (#2937)
Signed-off-by: silver-ymz <[email protected]>
---
core/src/services/fs/docs.md | 4 +-
core/src/services/http/backend.rs | 52 +-----
core/src/services/http/docs.md | 48 ++++++
core/src/services/memcached/backend.rs | 45 +-----
core/src/services/memcached/docs.md | 44 +++++
core/src/services/obs/backend.rs | 58 +------
core/src/services/obs/docs.md | 55 +++++++
core/src/services/supabase/backend.rs | 52 +-----
core/src/services/supabase/docs.md | 53 ++++++
core/src/services/wasabi/backend.rs | 223 +-------------------------
core/src/services/wasabi/docs.md | 198 +++++++++++++++++++++++
core/src/services/webdav/backend.rs | 53 +-----
core/src/services/webdav/docs.md | 51 ++++++
website/docs/services/gcs.mdx | 1 +
website/docs/services/http.mdx | 58 +++++++
website/docs/services/memcached.mdx | 58 +++++++
website/docs/services/obs.mdx | 64 ++++++++
website/docs/services/supabase.mdx | 67 ++++++++
website/docs/services/{gcs.mdx => wasabi.mdx} | 37 ++---
website/docs/services/webdav.mdx | 64 ++++++++
20 files changed, 790 insertions(+), 495 deletions(-)
diff --git a/core/src/services/fs/docs.md b/core/src/services/fs/docs.md
index 0d5517c63..5547a17af 100644
--- a/core/src/services/fs/docs.md
+++ b/core/src/services/fs/docs.md
@@ -18,8 +18,8 @@ This service can be used to:
## Configuration
- `root`: Set the work dir for backend.
-
-Refer to public API docs for more information.
+-
+You can refer to [`FsBuilder`]'s docs for more information
## Example
diff --git a/core/src/services/http/backend.rs
b/core/src/services/http/backend.rs
index 25f06f993..76b98fb73 100644
--- a/core/src/services/http/backend.rs
+++ b/core/src/services/http/backend.rs
@@ -32,56 +32,8 @@ use super::error::parse_error;
use crate::raw::*;
use crate::*;
-/// HTTP Read-only service support like Nginx and Caddy.
-///
-/// # Capabilities
-///
-/// This service can be used to:
-///
-/// - [x] stat
-/// - [x] read
-/// - [ ] ~~write~~
-/// - [ ] ~~create_dir~~
-/// - [ ] ~~delete~~
-/// - [ ] ~~copy~~
-/// - [ ] ~~rename~~
-/// - [ ] ~~list~~
-/// - [ ] ~~scan~~
-/// - [ ] ~~presign~~
-/// - [ ] blocking
-///
-/// # Notes
-///
-/// Only `read` ans `stat` are supported. We can use this service to visit any
-/// HTTP Server like nginx, caddy.
-///
-/// # Configuration
-///
-/// - `endpoint`: set the endpoint for http
-/// - `root`: Set the work directory for backend
-///
-/// You can refer to [`HttpBuilder`]'s docs for more information
-///
-/// # Example
-///
-/// ## Via Builder
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use opendal::services::Http;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// // create backend builder
-/// let mut builder = Http::default();
-///
-/// builder.endpoint("127.0.0.1");
-///
-/// let op: Operator = Operator::new(builder)?.finish();
-/// Ok(())
-/// }
-/// ```
+/// HTTP Read-only service support like [Nginx](https://www.nginx.com/) and
[Caddy](https://caddyserver.com/).
+#[doc = include_str!("docs.md")]
#[derive(Default)]
pub struct HttpBuilder {
endpoint: Option<String>,
diff --git a/core/src/services/http/docs.md b/core/src/services/http/docs.md
new file mode 100644
index 000000000..8e572214a
--- /dev/null
+++ b/core/src/services/http/docs.md
@@ -0,0 +1,48 @@
+## Capabilities
+
+This service can be used to:
+
+- [x] stat
+- [x] read
+- [ ] ~~write~~
+- [ ] ~~create_dir~~
+- [ ] ~~delete~~
+- [ ] ~~copy~~
+- [ ] ~~rename~~
+- [ ] ~~list~~
+- [ ] ~~scan~~
+- [ ] ~~presign~~
+- [ ] blocking
+
+## Notes
+
+Only `read` ans `stat` are supported. We can use this service to visit any
+HTTP Server like nginx, caddy.
+
+## Configuration
+
+- `endpoint`: set the endpoint for http
+- `root`: Set the work directory for backend
+
+You can refer to [`HttpBuilder`]'s docs for more information
+
+## Example
+
+### Via Builder
+
+```rust
+use anyhow::Result;
+use opendal::services::Http;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ // create http backend builder
+ let mut builder = Http::default();
+
+ builder.endpoint("127.0.0.1");
+
+ let op: Operator = Operator::new(builder)?.finish();
+ Ok(())
+}
+```
\ No newline at end of file
diff --git a/core/src/services/memcached/backend.rs
b/core/src/services/memcached/backend.rs
index 23fad5b50..2731a70a1 100644
--- a/core/src/services/memcached/backend.rs
+++ b/core/src/services/memcached/backend.rs
@@ -29,50 +29,7 @@ use crate::raw::*;
use crate::*;
/// [Memcached](https://memcached.org/) service support.
-///
-/// # Capabilities
-///
-/// This service can be used to:
-///
-/// - [x] stat
-/// - [x] read
-/// - [x] write
-/// - [x] create_dir
-/// - [x] delete
-/// - [ ] copy
-/// - [ ] rename
-/// - [ ] ~~list~~
-/// - [ ] scan
-/// - [ ] ~~presign~~
-/// - [ ] blocking
-///
-/// # Configuration
-///
-/// - `root`: Set the working directory of `OpenDAL`
-/// - `endpoint`: Set the network address of memcached server
-/// - `default_ttl`: Set the ttl for memcached service.
-///
-/// You can refer to [`MemcachedBuilder`]'s docs for more information
-///
-/// # Example
-///
-/// ## Via Builder
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use opendal::services::Memcached;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// let mut builder = Memcached::default();
-///
-/// builder.endpoint("tcp://127.0.0.1:11211");
-///
-/// let op: Operator = Operator::new(builder)?.finish();
-/// Ok(())
-/// }
-/// ```
+#[doc = include_str!("docs.md")]
#[derive(Clone, Default)]
pub struct MemcachedBuilder {
/// network address of the memcached service.
diff --git a/core/src/services/memcached/docs.md
b/core/src/services/memcached/docs.md
new file mode 100644
index 000000000..0de179ab9
--- /dev/null
+++ b/core/src/services/memcached/docs.md
@@ -0,0 +1,44 @@
+## Capabilities
+
+This service can be used to:
+
+- [x] stat
+- [x] read
+- [x] write
+- [x] create_dir
+- [x] delete
+- [ ] copy
+- [ ] rename
+- [ ] ~~list~~
+- [ ] scan
+- [ ] ~~presign~~
+- [ ] blocking
+
+## Configuration
+
+- `root`: Set the working directory of `OpenDAL`
+- `endpoint`: Set the network address of memcached server
+- `default_ttl`: Set the ttl for memcached service.
+
+You can refer to [`MemcachedBuilder`]'s docs for more information
+
+## Example
+
+### Via Builder
+
+```rust
+use anyhow::Result;
+use opendal::services::Memcached;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ // create memcached backend builder
+ let mut builder = Memcached::default();
+
+ builder.endpoint("tcp://127.0.0.1:11211");
+
+ let op: Operator = Operator::new(builder)?.finish();
+ Ok(())
+}
+```
\ No newline at end of file
diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs
index 78ecf0976..123f5b818 100644
--- a/core/src/services/obs/backend.rs
+++ b/core/src/services/obs/backend.rs
@@ -41,64 +41,8 @@ use crate::*;
/// ref:
<https://support.huaweicloud.com/intl/en-us/ugobs-obs/obs_41_0021.html>
const MINIMUM_MULTIPART_SIZE: usize = 5 * 1024 * 1024;
-/// Huawei Cloud OBS services support.
-///
-/// # Capabilities
-///
-/// This service can be used to:
-///
-/// - [x] stat
-/// - [x] read
-/// - [x] write
-/// - [x] create_dir
-/// - [x] delete
-/// - [x] copy
-/// - [ ] rename
-/// - [x] list
-/// - [x] scan
-/// - [x] presign
-/// - [ ] blocking
-///
-/// # Configuration
-///
-/// - `root`: Set the work directory for backend
-/// - `bucket`: Set the container name for backend
-/// - `endpoint`: Customizable endpoint setting
-/// - `access_key_id`: Set the access_key_id for backend.
-/// - `secret_access_key`: Set the secret_access_key for backend.
-///
-/// You can refer to [`ObsBuilder`]'s docs for more information
-///
-/// # Example
-///
-/// ## Via Builder
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use opendal::services::Obs;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// // create backend builder
-/// let mut builder = Obs::default();
-///
-/// // set the storage bucket for OpenDAL
-/// builder.bucket("test");
-/// // Set the access_key_id and secret_access_key.
-/// //
-/// // OpenDAL will try load credential from the env.
-/// // If credential not set and no valid credential in env, OpenDAL will
-/// // send request without signing like anonymous user.
-/// builder.access_key_id("access_key_id");
-/// builder.secret_access_key("secret_access_key");
-///
-/// let op: Operator = Operator::new(builder)?.finish();
-///
-/// Ok(())
-/// }
-/// ```
/// Huawei-Cloud Object Storage Service (OBS) support
+#[doc = include_str!("docs.md")]
#[derive(Default, Clone)]
pub struct ObsBuilder {
root: Option<String>,
diff --git a/core/src/services/obs/docs.md b/core/src/services/obs/docs.md
new file mode 100644
index 000000000..d080ed585
--- /dev/null
+++ b/core/src/services/obs/docs.md
@@ -0,0 +1,55 @@
+## Capabilities
+
+This service can be used to:
+
+- [x] stat
+- [x] read
+- [x] write
+- [x] create_dir
+- [x] delete
+- [x] copy
+- [ ] rename
+- [x] list
+- [x] scan
+- [x] presign
+- [ ] blocking
+
+## Configuration
+
+- `root`: Set the work directory for backend
+- `bucket`: Set the container name for backend
+- `endpoint`: Customizable endpoint setting
+- `access_key_id`: Set the access_key_id for backend.
+- `secret_access_key`: Set the secret_access_key for backend.
+
+You can refer to [`ObsBuilder`]'s docs for more information
+
+## Example
+
+### Via Builder
+
+```rust
+use anyhow::Result;
+use opendal::services::Obs;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ // create backend builder
+ let mut builder = Obs::default();
+
+ // set the storage bucket for OpenDAL
+ builder.bucket("test");
+ // Set the access_key_id and secret_access_key.
+ //
+ // OpenDAL will try load credential from the env.
+ // If credential not set and no valid credential in env, OpenDAL will
+ // send request without signing like anonymous user.
+ builder.access_key_id("access_key_id");
+ builder.secret_access_key("secret_access_key");
+
+ let op: Operator = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
\ No newline at end of file
diff --git a/core/src/services/supabase/backend.rs
b/core/src/services/supabase/backend.rs
index 3872623c2..2ace7385c 100644
--- a/core/src/services/supabase/backend.rs
+++ b/core/src/services/supabase/backend.rs
@@ -28,56 +28,8 @@ use super::writer::*;
use crate::raw::*;
use crate::*;
-/// Supabase service
-///
-/// # Capabilities
-///
-/// - [x] stat
-/// - [x] read
-/// - [x] write
-/// - [x] create_dir
-/// - [x] delete
-/// - [ ] copy
-/// - [ ] rename
-/// - [ ] list
-/// - [ ] scan
-/// - [ ] presign
-/// - [ ] blocking
-///
-/// # Configuration
-///
-/// - `root`: Set the work dir for backend.
-/// - `bucket`: Set the container name for backend.
-/// - `endpoint`: Set the endpoint for backend.
-/// - `key`: Set the authorization key for the backend, do not set if you want
to read public bucket
-///
-/// ## Authorization keys
-///
-/// There are two types of key in the Supabase, one is anon_key(Client key),
another one is
-/// service_role_key(Secret key). The former one can only write public
resources while the latter one
-/// can access all resources. Note that if you want to read public resources,
do not set the key.
-///
-/// # Example
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use opendal::services::Supabase;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// let mut builder = Supabase::default();
-/// builder.root("/");
-/// builder.bucket("test_bucket");
-/// builder.endpoint("http://127.0.0.1:54321");
-/// // this sets up the anon_key, which means this operator can only write
public resource
-/// builder.key("some_anon_key");
-///
-/// let op: Operator = Operator::new(builder)?.finish();
-///
-/// Ok(())
-/// }
-/// ```
+/// [Supabase](https://supabase.com/) service support
+#[doc = include_str!("docs.md")]
#[derive(Default)]
pub struct SupabaseBuilder {
root: Option<String>,
diff --git a/core/src/services/supabase/docs.md
b/core/src/services/supabase/docs.md
new file mode 100644
index 000000000..331ae7fd6
--- /dev/null
+++ b/core/src/services/supabase/docs.md
@@ -0,0 +1,53 @@
+## Capabilities
+
+- [x] stat
+- [x] read
+- [x] write
+- [x] create_dir
+- [x] delete
+- [ ] copy
+- [ ] rename
+- [ ] list
+- [ ] scan
+- [ ] presign
+- [ ] blocking
+
+## Configuration
+
+- `root`: Set the work dir for backend.
+- `bucket`: Set the container name for backend.
+- `endpoint`: Set the endpoint for backend.
+- `key`: Set the authorization key for the backend, do not set if you want to
read public bucket
+
+### Authorization keys
+
+There are two types of key in the Supabase, one is anon_key(Client key),
another one is
+service_role_key(Secret key). The former one can only write public resources
while the latter one
+can access all resources. Note that if you want to read public resources, do
not set the key.
+
+## Example
+
+### Via Builder
+
+```rust
+use anyhow::Result;
+use opendal::services::Supabase;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut builder = Supabase::default();
+
+ builder.root("/");
+ builder.bucket("test_bucket");
+ builder.endpoint("http://127.0.0.1:54321");
+ // this sets up the anon_key, which means this operator can only write
public resource
+ builder.key("some_anon_key");
+
+ let op: Operator = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
+
+
\ No newline at end of file
diff --git a/core/src/services/wasabi/backend.rs
b/core/src/services/wasabi/backend.rs
index a8a8da91c..a08381616 100644
--- a/core/src/services/wasabi/backend.rs
+++ b/core/src/services/wasabi/backend.rs
@@ -55,228 +55,7 @@ static ENDPOINT_TEMPLATES: Lazy<HashMap<&'static str,
&'static str>> = Lazy::new
});
/// Wasabi (an aws S3 compatible service) support
-///
-/// # Capabilities
-///
-/// This service can be used to:
-///
-/// - [x] stat
-/// - [x] read
-/// - [x] write
-/// - [x] create_dir
-/// - [x] delete
-/// - [x] copy
-/// - [x] rename
-/// - [x] list
-/// - [x] scan
-/// - [x] presign
-/// - [ ] blocking
-///
-/// # Configuration
-///
-/// - `root`: Set the work dir for backend.
-/// - `bucket`: Set the container name for backend.
-/// - `endpoint`: Set the endpoint for backend.
-/// - `region`: Set the region for backend.
-/// - `access_key_id`: Set the access_key_id for backend.
-/// - `secret_access_key`: Set the secret_access_key for backend.
-/// - `security_token`: Set the security_token for backend.
-/// - `default_storage_class`: Set the default storage_class for backend.
-/// - `server_side_encryption`: Set the server_side_encryption for backend.
-/// - `server_side_encryption_aws_kms_key_id`: Set the
server_side_encryption_aws_kms_key_id for backend.
-/// - `server_side_encryption_customer_algorithm`: Set the
server_side_encryption_customer_algorithm for backend.
-/// - `server_side_encryption_customer_key`: Set the
server_side_encryption_customer_key for backend.
-/// - `server_side_encryption_customer_key_md5`: Set the
server_side_encryption_customer_key_md5 for backend.
-/// - `disable_config_load`: Disable aws config load from env
-/// - `enable_virtual_host_style`: Enable virtual host style.
-///
-/// Refer to [`WasabiBuilder`]'s public API docs for more information.
-///
-/// # Temporary security credentials
-///
-/// OpenDAL now provides support for S3 temporary security credentials in IAM.
-///
-/// The way to take advantage of this feature is to build your S3 backend with
`Builder::security_token`.
-///
-/// But OpenDAL will not refresh the temporary security credentials, please
keep in mind to refresh those credentials in time.
-///
-/// # Server Side Encryption
-///
-/// OpenDAL provides full support of S3 Server Side Encryption(SSE) features.
-///
-/// The easiest way to configure them is to use helper functions like
-///
-/// - SSE-KMS: `server_side_encryption_with_aws_managed_kms_key`
-/// - SSE-KMS: `server_side_encryption_with_customer_managed_kms_key`
-/// - SSE-S3: `server_side_encryption_with_s3_key`
-/// - SSE-C: `server_side_encryption_with_customer_key`
-///
-/// If those functions don't fulfill need, low-level options are also provided:
-///
-/// - Use service managed kms key
-/// - `server_side_encryption="aws:kms"`
-/// - Use customer provided kms key
-/// - `server_side_encryption="aws:kms"`
-/// - `server_side_encryption_aws_kms_key_id="your-kms-key"`
-/// - Use S3 managed key
-/// - `server_side_encryption="AES256"`
-/// - Use customer key
-/// - `server_side_encryption_customer_algorithm="AES256"`
-/// - `server_side_encryption_customer_key="base64-of-your-aes256-key"`
-/// -
`server_side_encryption_customer_key_md5="base64-of-your-aes256-key-md5"`
-///
-/// After SSE have been configured, all requests send by this backed will
attach those headers.
-///
-/// Reference: [Protecting data using server-side
encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)
-///
-/// # Example
-///
-/// ## Basic Setup
-///
-/// ```no_run
-/// use std::sync::Arc;
-///
-/// use anyhow::Result;
-/// use opendal::services::Wasabi;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// // Create s3 backend builder.
-/// let mut builder = Wasabi::default();
-/// // Set the root for s3, all operations will happen under this root.
-/// //
-/// // NOTE: the root must be absolute path.
-/// builder.root("/path/to/dir");
-/// // Set the bucket name, this is required.
-/// builder.bucket("test");
-/// // Set the endpoint.
-/// //
-/// // For examples:
-/// // - "https://s3.wasabisys.com"
-/// // - "http://127.0.0.1:9000"
-/// // - "https://oss-ap-northeast-1.aliyuncs.com"
-/// // - "https://cos.ap-seoul.myqcloud.com"
-/// //
-/// // Default to "https://s3.wasabisys.com"
-/// builder.endpoint("https://s3.wasabisys.com");
-/// // Set the access_key_id and secret_access_key.
-/// //
-/// // OpenDAL will try load credential from the env.
-/// // If credential not set and no valid credential in env, OpenDAL will
-/// // send request without signing like anonymous user.
-/// builder.access_key_id("access_key_id");
-/// builder.secret_access_key("secret_access_key");
-///
-/// let op: Operator = Operator::new(builder)?.finish();
-///
-/// Ok(())
-/// }
-/// ```
-///
-/// ## Wasabi with SSE-C
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use log::info;
-/// use opendal::services::Wasabi;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// let mut builder = Wasabi::default();
-///
-/// // Setup builders
-///
-/// // Enable SSE-C
-/// builder.server_side_encryption_with_customer_key("AES256",
"customer_key".as_bytes());
-///
-/// let op = Operator::new(builder)?.finish();
-/// info!("operator: {:?}", op);
-///
-/// // Writing your testing code here.
-///
-/// Ok(())
-/// }
-/// ```
-///
-/// ## Wasabi with SSE-KMS and aws managed kms key
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use log::info;
-/// use opendal::services::Wasabi;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// let mut builder = Wasabi::default();
-///
-/// // Setup builders
-///
-/// // Enable SSE-KMS with aws managed kms key
-/// builder.server_side_encryption_with_aws_managed_kms_key();
-///
-/// let op = Operator::new(builder)?.finish();
-/// info!("operator: {:?}", op);
-///
-/// // Writing your testing code here.
-///
-/// Ok(())
-/// }
-/// ```
-///
-/// ## Wasabi with SSE-KMS and customer managed kms key
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use log::info;
-/// use opendal::services::Wasabi;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// let mut builder = Wasabi::default();
-///
-/// // Setup builders
-///
-/// // Enable SSE-KMS with customer managed kms key
-///
builder.server_side_encryption_with_customer_managed_kms_key("aws_kms_key_id");
-///
-/// let op = Operator::new(builder)?.finish();
-/// info!("operator: {:?}", op);
-///
-/// // Writing your testing code here.
-///
-/// Ok(())
-/// }
-/// ```
-///
-/// ## Wasabi with SSE-S3
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use log::info;
-/// use opendal::services::Wasabi;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// let mut builder = Wasabi::default();
-///
-/// // Setup builders
-///
-/// // Enable SSE-S3
-/// builder.server_side_encryption_with_s3_key();
-///
-/// let op = Operator::new(builder)?.finish();
-/// info!("operator: {:?}", op);
-///
-/// // Writing your testing code here.
-///
-/// Ok(())
-/// }
-/// ```
+#[doc = include_str!("docs.md")]
#[derive(Default)]
pub struct WasabiBuilder {
root: Option<String>,
diff --git a/core/src/services/wasabi/docs.md b/core/src/services/wasabi/docs.md
new file mode 100644
index 000000000..4b2cb2d42
--- /dev/null
+++ b/core/src/services/wasabi/docs.md
@@ -0,0 +1,198 @@
+## Capabilities
+
+This service can be used to:
+
+- [x] stat
+- [x] read
+- [x] write
+- [x] create_dir
+- [x] delete
+- [x] copy
+- [x] rename
+- [x] list
+- [x] scan
+- [x] presign
+- [ ] blocking
+
+## Configuration
+
+- `root`: Set the work dir for backend.
+- `bucket`: Set the container name for backend.
+- `endpoint`: Set the endpoint for backend.
+- `region`: Set the region for backend.
+- `access_key_id`: Set the access_key_id for backend.
+- `secret_access_key`: Set the secret_access_key for backend.
+- `security_token`: Set the security_token for backend.
+- `default_storage_class`: Set the default storage_class for backend.
+- `server_side_encryption`: Set the server_side_encryption for backend.
+- `server_side_encryption_aws_kms_key_id`: Set the
server_side_encryption_aws_kms_key_id for backend.
+- `server_side_encryption_customer_algorithm`: Set the
server_side_encryption_customer_algorithm for kend.
+- `server_side_encryption_customer_key`: Set the
server_side_encryption_customer_key for backend.
+- `server_side_encryption_customer_key_md5`: Set the
server_side_encryption_customer_key_md5 for kend.
+- `disable_config_load`: Disable aws config load from env
+- `enable_virtual_host_style`: Enable virtual host style.
+
+Refer to [`WasabiBuilder`]'s public API docs for more information.
+
+### Temporary security credentials
+
+OpenDAL now provides support for S3 temporary security credentials in IAM.
+
+The way to take advantage of this feature is to build your S3 backend with
`Builder::security_token`.
+
+But OpenDAL will not refresh the temporary security credentials, please keep
in mind to refresh those entials in time.
+
+### Server Side Encryption
+
+OpenDAL provides full support of S3 Server Side Encryption(SSE) features.
+
+The easiest way to configure them is to use helper functions like
+
+- SSE-KMS: `server_side_encryption_with_aws_managed_kms_key`
+- SSE-KMS: `server_side_encryption_with_customer_managed_kms_key`
+- SSE-S3: `server_side_encryption_with_s3_key`
+- SSE-C: `server_side_encryption_with_customer_key`
+
+If those functions don't fulfill need, low-level options are also provided:
+
+- Use service managed kms key
+ - `server_side_encryption="aws:kms"`
+- Use customer provided kms key
+ - `server_side_encryption="aws:kms"`
+ - `server_side_encryption_aws_kms_key_id="your-kms-key"`
+- Use S3 managed key
+ - `server_side_encryption="AES256"`
+- Use customer key
+ - `server_side_encryption_customer_algorithm="AES256"`
+ - `server_side_encryption_customer_key="base64-of-your-aes256-key"`
+ - `server_side_encryption_customer_key_md5="base64-of-your-aes256-key-md5"`
+
+After SSE have been configured, all requests send by this backed will attach
those headers.
+
+Reference: [Protecting data using server-side
encryption](https://docs.aws.amazon.com/AmazonS3/latest/rguide/serv-side-encryption.html)
+
+## Example
+
+### Via Builder
+
+#### Basic Setup
+
+```rust
+use anyhow::Result;
+use opendal::services::Wasabi;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ // Create s3 backend builder.
+ let mut builder = Wasabi::default();
+ // Set the root for s3, all operations will happen under this root.
+ //
+ // NOTE: the root must be absolute path.
+ builder.root("/path/to/dir");
+ // Set the bucket name, this is required.
+ builder.bucket("test");
+ // Set the endpoint.
+ //
+ // For examples:
+ // - "https://s3.wasabisys.com"
+ // - "http://127.0.0.1:9000"
+ // - "https://oss-ap-northeast-1.aliyuncs.com"
+ // - "https://cos.ap-seoul.myqcloud.com"
+ //
+ // Default to "https://s3.wasabisys.com"
+ builder.endpoint("https://s3.wasabisys.com");
+ // Set the access_key_id and secret_access_key.
+ //
+ // OpenDAL will try load credential from the env.
+ // If credential not set and no valid credential in env, OpenDAL will
+ // send request without signing like anonymous user.
+ builder.access_key_id("access_key_id");
+ builder.secret_access_key("secret_access_key");
+
+ let op: Operator = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
+
+#### Wasabi with SSE-C
+
+```rust
+use anyhow::Result;
+use opendal::services::Wasabi;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut builder = Wasabi::default();
+
+ // Enable SSE-C
+ builder.server_side_encryption_with_customer_key("AES256",
"customer_key".as_bytes());
+
+ let op = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
+
+#### Wasabi with SSE-KMS and aws managed kms key
+
+```rust
+use anyhow::Result;
+use opendal::services::Wasabi;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut builder = Wasabi::default();
+
+ // Enable SSE-KMS with aws managed kms key
+ builder.server_side_encryption_with_aws_managed_kms_key();
+
+ let op = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
+
+#### Wasabi with SSE-KMS and customer managed kms key
+
+```rust
+use anyhow::Result;
+use opendal::services::Wasabi;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut builder = Wasabi::default();
+
+ // Enable SSE-KMS with customer managed kms key
+
builder.server_side_encryption_with_customer_managed_kms_key("aws_kms_key_id");
+
+ let op = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
+
+#### Wasabi with SSE-S3
+
+```rust
+use anyhow::Result;
+use log::info;
+use opendal::services::Wasabi;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut builder = Wasabi::default();
+
+ // Enable SSE-S3
+ builder.server_side_encryption_with_s3_key();
+
+ let op = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
\ No newline at end of file
diff --git a/core/src/services/webdav/backend.rs
b/core/src/services/webdav/backend.rs
index b4fef1db5..bdf8e9ce4 100644
--- a/core/src/services/webdav/backend.rs
+++ b/core/src/services/webdav/backend.rs
@@ -38,58 +38,7 @@ use crate::raw::*;
use crate::*;
/// [WebDAV](https://datatracker.ietf.org/doc/html/rfc4918) backend support.
-///
-/// # Capabilities
-///
-/// This service can be used to:
-///
-/// - [x] stat
-/// - [x] read
-/// - [x] write
-/// - [x] create_dir
-/// - [x] delete
-/// - [x] copy
-/// - [x] rename
-/// - [x] list
-/// - [ ] ~~scan~~
-/// - [ ] ~~presign~~
-/// - [ ] blocking
-///
-/// # Notes
-///
-/// Bazel Remote Caching and Ccache HTTP Storage is also part of this service.
-/// Users can use `webdav` to connect those services.
-///
-/// # Configuration
-///
-/// - `endpoint`: set the endpoint for webdav
-/// - `root`: Set the work directory for backend
-///
-/// You can refer to [`WebdavBuilder`]'s docs for more information
-///
-/// # Example
-///
-/// ## Via Builder
-///
-/// ```no_run
-/// use anyhow::Result;
-/// use opendal::services::Webdav;
-/// use opendal::Operator;
-///
-/// #[tokio::main]
-/// async fn main() -> Result<()> {
-/// // create backend builder
-/// let mut builder = Webdav::default();
-///
-/// builder
-/// .endpoint("127.0.0.1")
-/// .username("xxx")
-/// .password("xxx");
-///
-/// let op: Operator = Operator::new(builder)?.finish();
-/// Ok(())
-/// }
-/// ```
+#[doc = include_str!("docs.md")]
#[derive(Default)]
pub struct WebdavBuilder {
endpoint: Option<String>,
diff --git a/core/src/services/webdav/docs.md b/core/src/services/webdav/docs.md
new file mode 100644
index 000000000..67a50ca10
--- /dev/null
+++ b/core/src/services/webdav/docs.md
@@ -0,0 +1,51 @@
+## Capabilities
+
+This service can be used to:
+
+- [x] stat
+- [x] read
+- [x] write
+- [x] create_dir
+- [x] delete
+- [x] copy
+- [x] rename
+- [x] list
+- [ ] ~~scan~~
+- [ ] ~~presign~~
+- [ ] blocking
+
+## Notes
+
+Bazel Remote Caching and Ccache HTTP Storage is also part of this service.
+Users can use `webdav` to connect those services.
+
+## Configuration
+
+- `endpoint`: set the endpoint for webdav
+- `root`: Set the work directory for backend
+
+You can refer to [`WebdavBuilder`]'s docs for more information
+
+## Example
+
+### Via Builder
+
+```rust
+use anyhow::Result;
+use opendal::services::Webdav;
+use opendal::Operator;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ // create backend builder
+ let mut builder = Webdav::default();
+
+ builder.endpoint("127.0.0.1");
+ builder.username("xxx")
+ builder.password("xxx");
+
+ let op: Operator = Operator::new(builder)?.finish();
+
+ Ok(())
+}
+```
\ No newline at end of file
diff --git a/website/docs/services/gcs.mdx b/website/docs/services/gcs.mdx
index 68db48d7d..3a84d4bfa 100644
--- a/website/docs/services/gcs.mdx
+++ b/website/docs/services/gcs.mdx
@@ -30,6 +30,7 @@ async fn main() -> Result<()> {
map.insert("credential".to_string(), "authentication token".to_string());
map.insert("predefined_acl".to_string(), "publicRead".to_string());
map.insert("default_storage_class".to_string(), "STANDARD".to_string());
+
let op: Operator = Operator::via_map(Scheme::Gcs, map)?;
Ok(())
}
diff --git a/website/docs/services/http.mdx b/website/docs/services/http.mdx
new file mode 100644
index 000000000..c7fd058ce
--- /dev/null
+++ b/website/docs/services/http.mdx
@@ -0,0 +1,58 @@
+---
+title: Http
+---
+
+HTTP Read-only service support like [Nginx](https://www.nginx.com/) and
[Caddy](https://caddyserver.com/).
+
+import Docs from '../../../core/src/services/http/docs.md'
+
+<Docs components={props.components} />
+
+### Via Config
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<Tabs>
+ <TabItem value="rust" label="Rust" default>
+
+```rust
+use anyhow::Result;
+use opendal::Operator;
+use opendal::Scheme;
+use std::collections::HashMap;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut map = HashMap::new();
+ map.insert("endpoint".to_string(), "127.0.0.1".to_string());
+
+ let op: Operator = Operator::via_map(Scheme::Http, map)?;
+ Ok(())
+}
+```
+
+ </TabItem>
+ <TabItem value="node.js" label="Node.js">
+
+```javascript
+import { Operator } from "opendal";
+async function main() {
+ const op = new Operator("http", {
+ endpoint: "127.0.0.1",
+ });
+}
+```
+
+ </TabItem>
+ <TabItem value="python" label="Python">
+
+```python
+import opendal
+op = opendal.Operator("http",
+ endpoint="127.0.0.1",
+)
+```
+
+ </TabItem>
+</Tabs>
\ No newline at end of file
diff --git a/website/docs/services/memcached.mdx
b/website/docs/services/memcached.mdx
new file mode 100644
index 000000000..8e3a1d98a
--- /dev/null
+++ b/website/docs/services/memcached.mdx
@@ -0,0 +1,58 @@
+---
+title: Memcached
+---
+
+[Memcached](https://memcached.org/) service support.
+
+import Docs from '../../../core/src/services/memcached/docs.md'
+
+<Docs components={props.components} />
+
+### Via Config
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<Tabs>
+ <TabItem value="rust" label="Rust" default>
+
+```rust
+use anyhow::Result;
+use opendal::Operator;
+use opendal::Scheme;
+use std::collections::HashMap;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut map = HashMap::new();
+ map.insert("endpoint".to_string(), "tcp://127.0.0.1:11211".to_string());
+
+ let op: Operator = Operator::via_map(Scheme::Memcached, map)?;
+ Ok(())
+}
+```
+
+ </TabItem>
+ <TabItem value="node.js" label="Node.js">
+
+```javascript
+import { Operator } from "opendal";
+async function main() {
+ const op = new Operator("memcached", {
+ endpoint: "tcp://127.0.0.1:11211",
+ });
+}
+```
+
+ </TabItem>
+ <TabItem value="python" label="Python">
+
+```python
+import opendal
+op = opendal.Operator("memcached",
+ endpoint="tcp://127.0.0.1:11211",
+)
+```
+
+ </TabItem>
+</Tabs>
\ No newline at end of file
diff --git a/website/docs/services/obs.mdx b/website/docs/services/obs.mdx
new file mode 100644
index 000000000..38eb73fac
--- /dev/null
+++ b/website/docs/services/obs.mdx
@@ -0,0 +1,64 @@
+---
+title: Obs
+---
+
+Huawei-Cloud Object Storage Service (OBS) support
+
+import Docs from '../../../core/src/services/obs/docs.md'
+
+<Docs components={props.components} />
+
+### Via Config
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<Tabs>
+ <TabItem value="rust" label="Rust" default>
+
+```rust
+use anyhow::Result;
+use opendal::Operator;
+use opendal::Scheme;
+use std::collections::HashMap;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut map = HashMap::new();
+ map.insert("bucket".to_string(), "test".to_string());
+ map.insert("access_key_id".to_string(), "access_key_id".to_string());
+ map.insert("secret_access_key".to_string(),
"secret_access_key".to_string());
+
+ let op: Operator = Operator::via_map(Scheme::Obs, map)?;
+ Ok(())
+}
+```
+
+ </TabItem>
+ <TabItem value="node.js" label="Node.js">
+
+```javascript
+import { Operator } from "opendal";
+async function main() {
+ const op = new Operator("obs", {
+ bucket: "test",
+ access_key_id: "access_key_id",
+ secret_access_key: "secret_access_key",
+ });
+}
+```
+
+ </TabItem>
+ <TabItem value="python" label="Python">
+
+```python
+import opendal
+op = opendal.Operator("obs",
+ bucket="test",
+ access_key_id="access_key_id",
+ secret_access_key="secret_access_key",
+)
+```
+
+ </TabItem>
+</Tabs>
\ No newline at end of file
diff --git a/website/docs/services/supabase.mdx
b/website/docs/services/supabase.mdx
new file mode 100644
index 000000000..447f74d38
--- /dev/null
+++ b/website/docs/services/supabase.mdx
@@ -0,0 +1,67 @@
+---
+title: Supabase
+---
+
+[Supabase](https://supabase.com/) service support.
+
+import Docs from '../../../core/src/services/supabase/docs.md'
+
+<Docs components={props.components} />
+
+### Via Config
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<Tabs>
+ <TabItem value="rust" label="Rust" default>
+
+```rust
+use anyhow::Result;
+use opendal::Operator;
+use opendal::Scheme;
+use std::collections::HashMap;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut map = HashMap::new();
+ map.insert("root".to_string(), "/".to_string());
+ map.insert("bucket".to_string(), "test_bucket".to_string());
+ map.insert("endpoint".to_string(), "http://127.0.0.1:54321".to_string());
+ map.insert("key".to_string(), "some_anon_key".to_string());
+
+ let op: Operator = Operator::via_map(Scheme::Supabase, map)?;
+ Ok(())
+}
+```
+
+ </TabItem>
+ <TabItem value="node.js" label="Node.js">
+
+```javascript
+import { Operator } from "opendal";
+async function main() {
+ const op = new Operator("supabase", {
+ root: "/",
+ bucket: "test_bucket",
+ endpoint: "http://127.0.0.1:54321",
+ key: "some_anon_key",
+ });
+}
+```
+
+ </TabItem>
+ <TabItem value="python" label="Python">
+
+```python
+import opendal
+op = opendal.Operator("supabase",
+ root="/",
+ bucket="test_bucket",
+ endpoint="http://127.0.0.1:54321",
+ key="some_anon_key",
+)
+```
+
+ </TabItem>
+</Tabs>
\ No newline at end of file
diff --git a/website/docs/services/gcs.mdx b/website/docs/services/wasabi.mdx
similarity index 53%
copy from website/docs/services/gcs.mdx
copy to website/docs/services/wasabi.mdx
index 68db48d7d..aa7ec677b 100644
--- a/website/docs/services/gcs.mdx
+++ b/website/docs/services/wasabi.mdx
@@ -1,10 +1,10 @@
---
-title: Gcs
+title: Wasabi
---
-Google Cloud Storage Support
+Wasabi (an aws S3 compatible service) support
-import Docs from '../../../core/src/services/gcs/docs.md'
+import Docs from '../../../core/src/services/wasabi/docs.md'
<Docs components={props.components} />
@@ -25,12 +25,13 @@ use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<()> {
let mut map = HashMap::new();
- map.insert("bucket".to_string(), "test".to_string());
map.insert("root".to_string(), "/path/to/dir".to_string());
- map.insert("credential".to_string(), "authentication token".to_string());
- map.insert("predefined_acl".to_string(), "publicRead".to_string());
- map.insert("default_storage_class".to_string(), "STANDARD".to_string());
- let op: Operator = Operator::via_map(Scheme::Gcs, map)?;
+ map.insert("bucket".to_string(), "test".to_string());
+ map.insert("endpoint".to_string(), "https://s3.wasabisys.com".to_string());
+ map.insert("access_key_id".to_string(), "access_key_id".to_string());
+ map.insert("secret_access_key".to_string(),
"secret_access_key".to_string());
+
+ let op: Operator = Operator::via_map(Scheme::Wasabi, map)?;
Ok(())
}
```
@@ -41,12 +42,12 @@ async fn main() -> Result<()> {
```javascript
import { Operator } from "opendal";
async function main() {
- const op = new Operator("gcs", {
- bucket: "test",
+ const op = new Operator("wasabi", {
root: "/path/to/dir",
- credential: "authentication token",
- predefined_acl: "publicRead",
- default_storage_class: "STANDARD",
+ bucket: "test",
+ endpoint: "https://s3.wasabisys.com",
+ access_key_id: "access_key_id",
+ secret_access_key: "secret_access_key",
});
}
```
@@ -56,12 +57,12 @@ async function main() {
```python
import opendal
-op = opendal.Operator("gcs",
- bucket="test",
+op = opendal.Operator("wasabi",
root="/path/to/dir",
- credential="authentication token",
- predefined_acl="publicRead",
- default_storage_class="STANDARD",
+ bucket="test",
+ endpoint="https://s3.wasabisys.com",
+ access_key_id="access_key_id",
+ secret_access_key="secret_access_key",
)
```
diff --git a/website/docs/services/webdav.mdx b/website/docs/services/webdav.mdx
new file mode 100644
index 000000000..ce0cd2c6f
--- /dev/null
+++ b/website/docs/services/webdav.mdx
@@ -0,0 +1,64 @@
+---
+title: WebDAV
+---
+
+[WebDAV](https://datatracker.ietf.org/doc/html/rfc4918) backend support.
+
+import Docs from '../../../core/src/services/webdav/docs.md'
+
+<Docs components={props.components} />
+
+### Via Config
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+<Tabs>
+ <TabItem value="rust" label="Rust" default>
+
+```rust
+use anyhow::Result;
+use opendal::Operator;
+use opendal::Scheme;
+use std::collections::HashMap;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+ let mut map = HashMap::new();
+ map.insert("endpoint".to_string(), "127.0.0.1".to_string());
+ map.insert("username".to_string(), "xxx".to_string());
+ map.insert("password".to_string(), "xxx".to_string());
+
+ let op: Operator = Operator::via_map(Scheme::Webdav, map)?;
+ Ok(())
+}
+```
+
+ </TabItem>
+ <TabItem value="node.js" label="Node.js">
+
+```javascript
+import { Operator } from "opendal";
+async function main() {
+ const op = new Operator("webdav", {
+ endpoint: "127.0.0.1",
+ username: "xxx",
+ password: "xxx",
+ });
+}
+```
+
+ </TabItem>
+ <TabItem value="python" label="Python">
+
+```python
+import opendal
+op = opendal.Operator("webdav",
+ endpoint="127.0.0.1",
+ username="xxx",
+ password="xxx",
+)
+```
+
+ </TabItem>
+</Tabs>
\ No newline at end of file