opendal 0.4.0

Open Data Access Layer that connect the whole world together.
Documentation
# OpenDAL   [![Build Status]][actions] [![Latest Version]][crates.io]

[Build Status]: https://img.shields.io/github/workflow/status/datafuselabs/opendal/CI/main
[actions]: https://github.com/datafuselabs/opendal/actions?query=branch%3Amain
[Latest Version]: https://img.shields.io/crates/v/opendal.svg
[crates.io]: https://crates.io/crates/opendal

**Open **D**ata **A**ccess **L**ayer that connect the whole world together.**

---

You may be looking for:

- [Examples]./examples
- [API documentation]https://opendal.databend.rs/opendal/
- [Release notes]https://github.com/datafuselabs/opendal/releases

## Status

OpenDAL is in **alpha** stage and has been early adopted by [databend](https://github.com/datafuselabs/databend/). Welcome any feedback at [Discussions](https://github.com/datafuselabs/opendal/discussions)!

## Supported Services

- [fs]https://docs.rs/opendal/latest/opendal/services/fs/index.html: POSIX alike file system.
- [memory]https://docs.rs/opendal/latest/opendal/services/memory/index.html: In memory backend support.
- [s3]https://docs.rs/opendal/latest/opendal/services/s3/index.html: AWS S3 alike services.

## Quickstart

```rust
use anyhow::Result;
use futures::AsyncReadExt;
use futures::StreamExt;
use opendal::services::fs;
use opendal::ObjectMode;
use opendal::Operator;

#[tokio::main]
async fn main() -> Result<()> {
    let op = Operator::new(fs::Backend::build().root("/tmp").finish().await?);

    let o = op.object("test_file");

    // Write data info file;
    let _ = o.write("Hello, World!").await?;

    // Read data from file;
    let bs = o.read().await?;

    // Read range from file;
    let bs = o.range_read(1..=11).await?;

    // Get file's Metadata
    let meta = o.metadata().await?;

    // List dir.
    let mut obs = op.objects("").await?.map(|o| o.expect("list object"));
    while let Some(o) = obs.next().await {
        let meta = o.metadata().await?;
        let path = meta.path();
        let mode = meta.mode();
        let length = meta.content_length();
    }

    // Delete file.
    o.delete().await?;

    Ok(())
}
```

More examples could be found at [examples](./examples).

## Contributing

Check out the [CONTRIBUTING.md](./CONTRIBUTING.md) guide for more details on getting started with contributing to this project.

## Getting help

Submit [issues](https://github.com/datafuselabs/opendal/issues/new/choose) for bug report or asking questions in [discussion](https://github.com/datafuselabs/opendal/discussions/new?category=q-a). 

#### License

<sup>
Licensed under <a href="./LICENSE">Apache License, Version 2.0</a>.
</sup>