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 cf8bb7527 docs: add rust usage example (#2447)
cf8bb7527 is described below
commit cf8bb7527113937a3ea3905970855fbd5548e210
Author: Flash <[email protected]>
AuthorDate: Mon Jun 12 18:45:23 2023 +0800
docs: add rust usage example (#2447)
* add rust usage example
* separate into different folders
* fix CI error
* make it to section01
* update
* update
---
Cargo.toml | 1 +
README.md | 2 +-
examples/rust/section01-introduction/.gitignore | 2 +
.../rust/section01-introduction/Cargo.toml | 38 ++++----------
examples/rust/section01-introduction/README.md | 49 ++++++++++++++++++
examples/rust/section01-introduction/src/main.rs | 58 ++++++++++++++++++++++
6 files changed, 121 insertions(+), 29 deletions(-)
diff --git a/Cargo.toml b/Cargo.toml
index 2addfb3d6..7f84c2152 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -20,6 +20,7 @@ debug = true
[workspace]
default-members = ["core"]
+exclude = ["examples"]
members = [
"core",
diff --git a/README.md b/README.md
index 6e188420a..62af4b0aa 100644
--- a/README.md
+++ b/README.md
@@ -98,7 +98,7 @@ Major components of the project include:
## Documentation
-The documentation is available at <https://opendal.apache.org>.
+The documentation is available at <https://opendal.apache.org>. Checkout
[here](./examples/) for the usage examples(still working on).
We are engaged in a practice we call "documentation as code". You can also
view the documentation directly in project's source code. And we welcome you to
contribute to the documentation.
diff --git a/examples/rust/section01-introduction/.gitignore
b/examples/rust/section01-introduction/.gitignore
new file mode 100644
index 000000000..eb68687a1
--- /dev/null
+++ b/examples/rust/section01-introduction/.gitignore
@@ -0,0 +1,2 @@
+/target
+/tmp
\ No newline at end of file
diff --git a/Cargo.toml b/examples/rust/section01-introduction/Cargo.toml
similarity index 59%
copy from Cargo.toml
copy to examples/rust/section01-introduction/Cargo.toml
index 2addfb3d6..7f09d4cec 100644
--- a/Cargo.toml
+++ b/examples/rust/section01-introduction/Cargo.toml
@@ -15,33 +15,15 @@
# specific language governing permissions and limitations
# under the License.
-[profile.bench]
-debug = true
-
-[workspace]
-default-members = ["core"]
-members = [
- "core",
-
- "bindings/c",
- "bindings/nodejs",
- "bindings/object_store",
- "bindings/python",
- "bindings/ruby",
- "bindings/java",
-
- "bin/oli",
- "bin/oay",
-]
-
-[workspace.package]
-authors = ["OpenDAL Contributors <[email protected]>"]
+[package]
+name = "section01-introduction"
+version = "0.1.0"
edition = "2021"
-homepage = "https://opendal.apache.org/"
-license = "Apache-2.0"
-repository = "https://github.com/apache/incubator-opendal"
-rust-version = "1.65"
-version = "0.37.0"
-[workspace.dependencies]
-opendal = { version = "0.37", path = "core" }
+# See more keys and their definitions at
https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+opendal = { version = "0.37.0" }
+tokio = { version = "1.27", features = ["full"] }
+anyhow = { version = "1.0.30", features = ["std"] }
+futures = { version = "0.3" }
\ No newline at end of file
diff --git a/examples/rust/section01-introduction/README.md
b/examples/rust/section01-introduction/README.md
new file mode 100644
index 000000000..33146096a
--- /dev/null
+++ b/examples/rust/section01-introduction/README.md
@@ -0,0 +1,49 @@
+# Introduction
+
+Rust is a systems programming language that is known for its performance,
memory safety, and concurrency features. OpenDAL(**Open D**ata **A**ccess
**L**ayer) is a Rust project to access data freely, painlessly and efficiently.
+
+This examples documentation is organized in a progressive manner, with each
section building upon the previous one. Each section is located in a different
folder and contains both documentation and a stand-alone project that can be
run independently.
+
+The following will briefly introduce dev environment set up, the Rust project
structure, some important files, and how to quickly create a project. This is
prepared for those who are not familiar with Rust. If you are familiar with
Rust, you can skip this section.
+
+
+# Environment set up
+
+There need rust toolchain in your local environment, if you haven't set it up,
you can refer
[here](https://github.com/apache/incubator-opendal/blob/main/CONTRIBUTING.md#bring-your-own-toolbox)
to figure it out.
+
+
+# Rust Project Structure
+
+A typical Rust project follows a specific directory structure. Here's an
overview of the main directories and files you'll encounter in a Rust project:
+
+- src/: This directory contains the source code for your Rust project. It
typically includes a main.rs file, which is the entry point for your
application.
+
+- Cargo.toml: This file contains metadata about your project, such as its
name, version, and dependencies. It also specifies the build configuration for
your project.
+
+## Cargo.toml
+
+Cargo is Rust's package manager and build tool. It uses the Cargo.toml file to
manage dependencies and build configurations for your project.
+
+Here's an example Cargo.toml file for a Rust project:
+
+```toml
+[package]
+name = "my_project"
+version = "0.1.0"
+authors = ["Your Name <[email protected]>"]
+edition = "2018"
+
+[dependencies]
+serde = { version = "1.0", features = ["derive"] }
+```
+## main.rs
+The main.rs file is the entry point for your Rust application. It typically
contains the `main()` function, which is the starting point for your program.
+
+
+# Basic Usage
+
+In this section, we chose `Fs` service as example because it is simple and
don't need extra work to set up, all service available can be found
[here](https://docs.rs/opendal/latest/opendal/services/index.html).
+
+This is a independent project, the `src/main.rs` provide a example usage about
`Fs`. It `read` a file and print its content to console, overwrite some new
content to it and read & print content again to verify the `write` operator has
been taken effect and then delete the file.
+
+Use `cargo run` to run this project. Just take a try.
\ No newline at end of file
diff --git a/examples/rust/section01-introduction/src/main.rs
b/examples/rust/section01-introduction/src/main.rs
new file mode 100644
index 000000000..9fb0534fc
--- /dev/null
+++ b/examples/rust/section01-introduction/src/main.rs
@@ -0,0 +1,58 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+use opendal::Operator;
+use opendal::Result;
+use opendal::services::Fs;
+
+#[tokio::main]
+async fn main() -> Result<()> {
+
+ // Create fs backend builder.
+ let mut builder = Fs::default();
+
+ // set the root to `section01-introduction/tmp`, all operations will
happen under this root.
+ // note that the root must be absolute path.
+ let mut path = std::env::current_dir().unwrap();
+ path.push("tmp");
+ builder.root(path.to_str().unwrap());
+
+ // create an `Operator` from `builder`, all file operations are initiated
from it.
+ let op: Operator = Operator::new(builder)?.finish();
+
+ // if the 'root' path haven't been set, then the `file_path` below should
be `section01-introduction/tmp/1.txt`.
+ let file_path = "1.txt";
+ op.write(file_path, "This is OpenDAL usage documentation
section01-introduction.").await?;
+
+ // read the file and print its content.
+ let read_file = op.read(file_path).await?;
+ let content = String::from_utf8(read_file).unwrap();
+ println!("{}", content);
+
+ // write the file.
+ op.write(file_path, "File content has been overwrite.").await?;
+
+ // verify the file content after the write operator.
+ let read_file = op.read(file_path).await?;
+ let content = String::from_utf8(read_file).unwrap();
+ println!("{}", content);
+
+ // delete the file.
+ op.delete(file_path).await?;
+
+ Ok(())
+}
\ No newline at end of file