Skip to content

Commit b04c14c

Browse files
authored
feat: add rustfs rust sdk (#40)
1 parent d3645df commit b04c14c

3 files changed

Lines changed: 199 additions & 4 deletions

File tree

docs/zh/developer/sdk/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ RustFS 是 100% 兼容 S3 协议的分布式对象存储软件。 用户可以
1616
- [Java SDK](./java.md)
1717
- [JavaScript SDK](./javascript.md)
1818
- [Python SDK](./python.md)
19+
- [Rust SDK](./rust.md)
1920

2021
## 阅读前名词解释
2122

docs/zh/developer/sdk/rust.md

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
---
2+
title: "RustFS Rust SDK 使用指南"
3+
description: "通过 Rust SDK 来对 RustFS 实例进行操作,包括存储桶、对象的创建和删除."
4+
---
5+
6+
# RustFS Rust SDK
7+
8+
由于 RustFS 是完全兼容 S3 的对象存储系统,因此可以通过对 S3 的 Rust SDK 做一些封装来构建适用于 RustFS 的 Rust SDK,通过 SDK 对 RustFS 进行操作,包括存储桶/对象的创建和删除、文件的上传和下载等。
9+
10+
## 前提条件
11+
12+
- 一个可用的 RustFS 实例(可参考[安装指南](../../installation/index.md)进行安装)。
13+
- 访问密钥(可参考[访问密钥管理](../../administration/iam/access-token.md)进行创建)。
14+
15+
## RustFS Rust SDK 构造
16+
17+
`region``access_key_id``secret_access_key` 以及 `endpoint_url` 构造为一个 Config 数据结构,并从环境变量读取对应信息:
18+
19+
```
20+
pub struct Config {
21+
pub region: String,
22+
pub access_key_id: String,
23+
pub secret_access_key: String,
24+
pub endpoint_url: String,
25+
}
26+
27+
impl Config {
28+
pub fn from_env() -> Result<Self> {
29+
let region = env::var("RUSTFS_REGION")?;
30+
let access_key_id = env::var("RUSTFS_ACCESS_KEY_ID")?;
31+
let secret_access_key = env::var("RUSTFS_SECRET_ACCESS_KEY")?;
32+
let endpoint_url = env::var("RUSTFS_ENDPOINT_URL")?;
33+
34+
Ok(Config {
35+
region,
36+
access_key_id,
37+
secret_access_key,
38+
endpoint_url,
39+
})
40+
}
41+
}
42+
```
43+
44+
利用上述构造好的 Config,借助 `aws_sdk_s3::Client` 构造 RustFS Client:
45+
46+
```
47+
let config = Config::from_env()?;
48+
49+
let credentials = Credentials::new(
50+
config.access_key_id,
51+
config.secret_access_key,
52+
None,
53+
None,
54+
"rustfs",
55+
);
56+
57+
let region = Region::new(config.region);
58+
59+
let endpoint_url = config.endpoint_url;
60+
61+
let shard_config = aws_config::defaults(BehaviorVersion::latest())
62+
.region(region)
63+
.credentials_provider(credentials)
64+
.endpoint_url(endpoint_url)
65+
.load()
66+
.await;
67+
68+
let rustfs_client = Client::new(&shard_config);
69+
```
70+
71+
接着使用构造好的 `rustfs_client` 进行响应的操作。
72+
73+
## 创建存储桶
74+
75+
```
76+
match rustfs_client
77+
.create_bucket()
78+
.bucket("your-bucket-name")
79+
.send()
80+
.await
81+
{
82+
Ok(_) => {
83+
println!("Bucket created successfully");
84+
}
85+
Err(e) => {
86+
println!("Error creating bucket: {:?}", e);
87+
return Err(e.into());
88+
}
89+
}
90+
```
91+
92+
## 删除存储桶
93+
94+
```
95+
match rustfs_client
96+
.delete_bucket()
97+
.bucket("cn-east-1rust-sdk")
98+
.send()
99+
.await
100+
{
101+
Ok(_) => {
102+
println!("Bucket deleted successfully");
103+
}
104+
Err(e) => {
105+
println!("Error deleting bucket: {:?}", e);
106+
return Err(e.into());
107+
}
108+
}
109+
```
110+
111+
## 列出存储桶
112+
113+
```
114+
match rustfs_client.list_buckets().send().await {
115+
Ok(res) => {
116+
println!("Total buckets number is {:?}", res.buckets().len());
117+
for bucket in res.buckets() {
118+
println!("Bucket: {:?}", bucket.name());
119+
}
120+
}
121+
Err(e) => {
122+
println!("Error listing buckets: {:?}", e);
123+
return Err(e.into());
124+
}
125+
}
126+
```
127+
128+
## 列出对象
129+
130+
```
131+
match rustfs_client
132+
.list_objects_v2()
133+
.bucket("rust-sdk-demo")
134+
.send()
135+
.await
136+
{
137+
Ok(res) => {
138+
println!("Total objects number is {:?}", res.contents().len());
139+
for object in res.contents() {
140+
println!("Object: {:?}", object.key());
141+
}
142+
}
143+
Err(e) => {
144+
println!("Error listing objects: {:?}", e);
145+
return Err(e.into());
146+
}
147+
}
148+
```
149+
150+
## 上传文件
151+
152+
```
153+
let data = fs::read("/file-path/1.txt").await.expect("can not open the file");
154+
155+
match rustfs_client
156+
.put_object()
157+
.bucket("rust-sdk-demo")
158+
.key("1.txt")
159+
.body(ByteStream::from(data))
160+
.send()
161+
.await
162+
{
163+
Ok(res) => {
164+
println!("Object uploaded successfully, res: {:?}", res);
165+
}
166+
Err(e) => {
167+
println!("Error uploading object: {:?}", e);
168+
return Err(e.into());
169+
}
170+
}
171+
```
172+
173+
## 下载对象
174+
175+
```
176+
match rustfs_client
177+
.get_object()
178+
.bucket("rust-sdk-demo")
179+
.key("1.txt")
180+
.send()
181+
.await
182+
{
183+
Ok(res) => {
184+
println!("Object downloaded successfully, res: {:?}", res);
185+
}
186+
Err(e) => {
187+
println!("Error downloading object: {:?}", e);
188+
return Err(e.into());
189+
}
190+
}
191+
```
192+
193+
其他的使用,大家可以自行探索,如果借助 Vibe Coding,就更简单了!

docs/zh/sidebar.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ export const zhSidebar = [
451451
},
452452
{
453453
text: 'SDK',
454+
link: '/zh/developer/sdk/index',
454455
// collapsed: true,
455456
items: [
456457
{
@@ -461,10 +462,10 @@ export const zhSidebar = [
461462
text: 'Python',
462463
link: '/zh/developer/sdk/python'
463464
},
464-
// {
465-
// text: 'Rust',
466-
// link: '/zh/developer/sdk/rust'
467-
// },
465+
{
466+
text: 'Rust',
467+
link: '/zh/developer/sdk/rust'
468+
},
468469
{
469470
text: 'JavaScript',
470471
link: '/zh/developer/sdk/javascript'

0 commit comments

Comments
 (0)