@@ -52,6 +52,29 @@ impl Object {
52
52
}
53
53
54
54
/// Create a new reader which can read the whole object.
55
+ ///
56
+ /// # Example
57
+ ///
58
+ /// ```
59
+ /// use opendal::services::memory;
60
+ /// use anyhow::Result;
61
+ /// use futures::io;
62
+ /// use opendal::Operator;
63
+ ///
64
+ /// #[tokio::main]
65
+ /// async fn main() -> Result<()> {
66
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
67
+ ///
68
+ /// let bs = "Hello, World!".as_bytes().to_vec();
69
+ /// op.object("test").writer().write_bytes(bs).await?;
70
+ ///
71
+ /// // Read whole file.
72
+ /// let mut r = op.object("test").reader();
73
+ /// io::copy(&mut r, &mut io::sink()).await?;
74
+ ///
75
+ /// Ok(())
76
+ /// }
77
+ /// ```
55
78
pub fn reader ( & self ) -> Reader {
56
79
Reader :: new ( self . acc . clone ( ) , self . meta . path ( ) , None , None )
57
80
}
@@ -62,6 +85,29 @@ impl Object {
62
85
///
63
86
/// The input offset and size are not checked, callers could meet error
64
87
/// while reading.
88
+ ///
89
+ /// # Example
90
+ ///
91
+ /// ```
92
+ /// use opendal::services::memory;
93
+ /// use anyhow::Result;
94
+ /// use futures::io;
95
+ /// use opendal::Operator;
96
+ ///
97
+ /// #[tokio::main]
98
+ /// async fn main() -> Result<()> {
99
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
100
+ ///
101
+ /// let bs = "Hello, World!".as_bytes().to_vec();
102
+ /// op.object("test").writer().write_bytes(bs).await?;
103
+ ///
104
+ /// // Read within [1, 2) bytes.
105
+ /// let mut r = op.object("test").range_reader(1, 1);
106
+ /// io::copy(&mut r, &mut io::sink()).await?;
107
+ ///
108
+ /// Ok(())
109
+ /// }
110
+ /// ```
65
111
pub fn range_reader ( & self , offset : u64 , size : u64 ) -> Reader {
66
112
Reader :: new ( self . acc . clone ( ) , self . meta . path ( ) , Some ( offset) , Some ( size) )
67
113
}
@@ -71,6 +117,29 @@ impl Object {
71
117
/// # Note
72
118
///
73
119
/// The input offset is not checked, callers could meet error while reading.
120
+ ///
121
+ /// # Example
122
+ ///
123
+ /// ```
124
+ /// use opendal::services::memory;
125
+ /// use anyhow::Result;
126
+ /// use futures::io;
127
+ /// use opendal::Operator;
128
+ ///
129
+ /// #[tokio::main]
130
+ /// async fn main() -> Result<()> {
131
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
132
+ ///
133
+ /// let bs = "Hello, World!".as_bytes().to_vec();
134
+ /// op.object("test").writer().write_bytes(bs).await?;
135
+ ///
136
+ /// // Read start offset 4.
137
+ /// let mut r = op.object("test").offset_reader(4);
138
+ /// io::copy(&mut r, &mut io::sink()).await?;
139
+ ///
140
+ /// Ok(())
141
+ /// }
142
+ /// ```
74
143
pub fn offset_reader ( & self , offset : u64 ) -> Reader {
75
144
Reader :: new ( self . acc . clone ( ) , self . meta . path ( ) , Some ( offset) , None )
76
145
}
@@ -80,30 +149,136 @@ impl Object {
80
149
/// # Note
81
150
///
82
151
/// The input size is not checked, callers could meet error while reading.
152
+ ///
153
+ /// # Example
154
+ ///
155
+ /// ```
156
+ /// use opendal::services::memory;
157
+ /// use anyhow::Result;
158
+ /// use futures::io;
159
+ /// use opendal::Operator;
160
+ ///
161
+ /// #[tokio::main]
162
+ /// async fn main() -> Result<()> {
163
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
164
+ ///
165
+ /// let bs = "Hello, World!".as_bytes().to_vec();
166
+ /// op.object("test").writer().write_bytes(bs).await?;
167
+ ///
168
+ /// // Read within 8 bytes.
169
+ /// let mut r = op.object("test").limited_reader(8);
170
+ /// io::copy(&mut r, &mut io::sink()).await?;
171
+ ///
172
+ /// Ok(())
173
+ /// }
174
+ /// ```
83
175
pub fn limited_reader ( & self , size : u64 ) -> Reader {
84
176
Reader :: new ( self . acc . clone ( ) , self . meta . path ( ) , None , Some ( size) )
85
177
}
86
178
87
179
/// Create a new writer which can write data into the object.
180
+ ///
181
+ /// # Example
182
+ ///
183
+ /// ```
184
+ /// use opendal::services::memory;
185
+ /// use anyhow::Result;
186
+ /// use futures::io;
187
+ /// use opendal::Operator;
188
+ ///
189
+ /// #[tokio::main]
190
+ /// async fn main() -> Result<()> {
191
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
192
+ ///
193
+ /// let bs = "Hello, World!".as_bytes().to_vec();
194
+ /// op.object("test").writer().write_bytes(bs).await?;
195
+ ///
196
+ /// Ok(())
197
+ /// }
198
+ /// ```
88
199
pub fn writer ( & self ) -> Writer {
89
200
Writer :: new ( self . acc . clone ( ) , self . meta . path ( ) )
90
201
}
91
202
92
203
/// Delete current object.
204
+ ///
205
+ /// # Example
206
+ ///
207
+ /// ```
208
+ /// use opendal::services::memory;
209
+ /// use anyhow::Result;
210
+ /// use futures::io;
211
+ /// use opendal::Operator;
212
+ ///
213
+ /// #[tokio::main]
214
+ /// async fn main() -> Result<()> {
215
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
216
+ ///
217
+ /// let bs = "Hello, World!".as_bytes().to_vec();
218
+ /// op.object("test").delete().await?;
219
+ ///
220
+ /// Ok(())
221
+ /// }
222
+ /// ```
93
223
pub async fn delete ( & self ) -> Result < ( ) > {
94
224
let op = & OpDelete :: new ( self . meta . path ( ) ) ;
95
225
96
226
self . acc . delete ( op) . await
97
227
}
98
228
99
229
/// Get current object's metadata.
230
+ ///
231
+ /// # Example
232
+ ///
233
+ /// ```
234
+ /// use opendal::services::memory;
235
+ /// use anyhow::Result;
236
+ /// use futures::io;
237
+ /// use opendal::Operator;
238
+ /// use opendal::error::Kind;
239
+ ///
240
+ /// #[tokio::main]
241
+ /// async fn main() -> Result<()> {
242
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
243
+ ///
244
+ /// if let Err(e) = op.object("test").metadata().await {
245
+ /// if e.kind() == Kind::ObjectNotExist {
246
+ /// println!("object not exist")
247
+ /// }
248
+ /// }
249
+ ///
250
+ /// Ok(())
251
+ /// }
252
+ /// ```
100
253
pub async fn metadata ( & self ) -> Result < Metadata > {
101
254
let op = & OpStat :: new ( self . meta . path ( ) ) ;
102
255
103
256
self . acc . stat ( op) . await
104
257
}
105
258
106
259
/// Use local cached metadata if possible.
260
+ ///
261
+ /// # Example
262
+ ///
263
+ /// ```
264
+ /// use opendal::services::memory;
265
+ /// use anyhow::Result;
266
+ /// use futures::io;
267
+ /// use opendal::Operator;
268
+ /// use opendal::error::Kind;
269
+ ///
270
+ /// #[tokio::main]
271
+ /// async fn main() -> Result<()> {
272
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
273
+ /// let mut o = op.object("test");
274
+ ///
275
+ /// o.metadata_cached().await;
276
+ /// // The second call to metadata_cached will have no cost.
277
+ /// o.metadata_cached().await;
278
+ ///
279
+ /// Ok(())
280
+ /// }
281
+ /// ```
107
282
pub async fn metadata_cached ( & mut self ) -> Result < & Metadata > {
108
283
if self . meta . complete ( ) {
109
284
return Ok ( & self . meta ) ;
@@ -120,6 +295,24 @@ impl Object {
120
295
}
121
296
122
297
/// Check if this object exist or not.
298
+ ///
299
+ /// # Example
300
+ ///
301
+ /// ```
302
+ /// use opendal::services::memory;
303
+ /// use anyhow::Result;
304
+ /// use futures::io;
305
+ /// use opendal::Operator;
306
+ /// use opendal::error::Kind;
307
+ ///
308
+ /// #[tokio::main]
309
+ /// async fn main() -> Result<()> {
310
+ /// let op = Operator::new(memory::Backend::build().finish().await?);
311
+ /// let _ = op.object("test").is_exist().await?;
312
+ ///
313
+ /// Ok(())
314
+ /// }
315
+ /// ```
123
316
pub async fn is_exist ( & self ) -> Result < bool > {
124
317
let r = self . metadata ( ) . await ;
125
318
match r {
0 commit comments