@@ -35,6 +35,7 @@ use opendal::raw::RpRead;
35
35
use opendal:: raw:: RpStat ;
36
36
use opendal:: raw:: RpWrite ;
37
37
use opendal:: Buffer ;
38
+ use opendal:: Metadata ;
38
39
use opendal:: Result ;
39
40
40
41
/// # TODO
@@ -89,11 +90,11 @@ impl<A: Access> LayeredAccess for RuntimeAccessor<A> {
89
90
type Inner = A ;
90
91
type Reader = RuntimeIO < A :: Reader > ;
91
92
type BlockingReader = A :: BlockingReader ;
92
- type Writer = A :: Writer ;
93
+ type Writer = RuntimeIO < A :: Writer > ;
93
94
type BlockingWriter = A :: BlockingWriter ;
94
- type Lister = A :: Lister ;
95
+ type Lister = RuntimeIO < A :: Lister > ;
95
96
type BlockingLister = A :: BlockingLister ;
96
- type Deleter = RuntimeIO < A :: Deleter > ;
97
+ type Deleter = RuntimeIO < RuntimeIO < A :: Deleter > > ;
97
98
type BlockingDeleter = A :: BlockingDeleter ;
98
99
99
100
fn inner ( & self ) -> & Self :: Inner {
@@ -130,6 +131,10 @@ impl<A: Access> LayeredAccess for RuntimeAccessor<A> {
130
131
. spawn ( async move { op. write ( & path, args) . await } )
131
132
. await
132
133
. expect ( "join must success" )
134
+ . map ( |( rp, r) | {
135
+ let r = RuntimeIO :: new ( r, self . runtime . clone ( ) ) ;
136
+ ( rp, r)
137
+ } )
133
138
}
134
139
135
140
async fn stat ( & self , path : & str , args : OpStat ) -> Result < RpStat > {
@@ -152,6 +157,10 @@ impl<A: Access> LayeredAccess for RuntimeAccessor<A> {
152
157
let r = RuntimeIO :: new ( r, self . runtime . clone ( ) ) ;
153
158
( rp, r)
154
159
} )
160
+ . map ( |( rp, r) | {
161
+ let r = RuntimeIO :: new ( r, self . runtime . clone ( ) ) ;
162
+ ( rp, r)
163
+ } )
155
164
}
156
165
157
166
async fn list ( & self , path : & str , args : OpList ) -> Result < ( RpList , Self :: Lister ) > {
@@ -161,6 +170,10 @@ impl<A: Access> LayeredAccess for RuntimeAccessor<A> {
161
170
. spawn ( async move { op. list ( & path, args) . await } )
162
171
. await
163
172
. expect ( "join must success" )
173
+ . map ( |( rp, r) | {
174
+ let r = RuntimeIO :: new ( r, self . runtime . clone ( ) ) ;
175
+ ( rp, r)
176
+ } )
164
177
}
165
178
166
179
fn blocking_read ( & self , path : & str , args : OpRead ) -> Result < ( RpRead , Self :: BlockingReader ) > {
@@ -211,13 +224,77 @@ impl<R: oio::Read> oio::Read for RuntimeIO<R> {
211
224
}
212
225
}
213
226
227
+ impl < R : oio:: Write > oio:: Write for RuntimeIO < R > {
228
+ async fn write ( & mut self , bs : Buffer ) -> Result < ( ) > {
229
+ let mut r = self . inner . take ( ) . expect ( "writer must be valid" ) ;
230
+ let runtime = self . runtime . clone ( ) ;
231
+
232
+ let ( r, res) = runtime
233
+ . spawn ( async move {
234
+ let res = r. write ( bs) . await ;
235
+ ( r, res)
236
+ } )
237
+ . await
238
+ . expect ( "join must success" ) ;
239
+ self . inner = Some ( r) ;
240
+ res
241
+ }
242
+
243
+ async fn close ( & mut self ) -> Result < Metadata > {
244
+ let mut r = self . inner . take ( ) . expect ( "writer must be valid" ) ;
245
+ let runtime = self . runtime . clone ( ) ;
246
+
247
+ let ( r, res) = runtime
248
+ . spawn ( async move {
249
+ let res = r. close ( ) . await ;
250
+ ( r, res)
251
+ } )
252
+ . await
253
+ . expect ( "join must success" ) ;
254
+ self . inner = Some ( r) ;
255
+ res
256
+ }
257
+
258
+ async fn abort ( & mut self ) -> Result < ( ) > {
259
+ let mut r = self . inner . take ( ) . expect ( "writer must be valid" ) ;
260
+ let runtime = self . runtime . clone ( ) ;
261
+
262
+ let ( r, res) = runtime
263
+ . spawn ( async move {
264
+ let res = r. abort ( ) . await ;
265
+ ( r, res)
266
+ } )
267
+ . await
268
+ . expect ( "join must success" ) ;
269
+ self . inner = Some ( r) ;
270
+ res
271
+ }
272
+ }
273
+
274
+ impl < R : oio:: List > oio:: List for RuntimeIO < R > {
275
+ async fn next ( & mut self ) -> Result < Option < oio:: Entry > > {
276
+ let mut r = self . inner . take ( ) . expect ( "lister must be valid" ) ;
277
+ let runtime = self . runtime . clone ( ) ;
278
+
279
+ let ( r, res) = runtime
280
+ . spawn ( async move {
281
+ let res = r. next ( ) . await ;
282
+ ( r, res)
283
+ } )
284
+ . await
285
+ . expect ( "join must success" ) ;
286
+ self . inner = Some ( r) ;
287
+ res
288
+ }
289
+ }
290
+
214
291
impl < R : oio:: Delete > oio:: Delete for RuntimeIO < R > {
215
292
fn delete ( & mut self , path : & str , args : OpDelete ) -> Result < ( ) > {
216
293
self . inner . as_mut ( ) . unwrap ( ) . delete ( path, args)
217
294
}
218
295
219
296
async fn flush ( & mut self ) -> Result < usize > {
220
- let mut r = self . inner . take ( ) . expect ( "reader must be valid" ) ;
297
+ let mut r = self . inner . take ( ) . expect ( "deleter must be valid" ) ;
221
298
let runtime = self . runtime . clone ( ) ;
222
299
223
300
let ( r, res) = runtime
0 commit comments