@@ -15,6 +15,14 @@ use wasmtime_wasi::p2::{OutputFile, WasiCtx, WasiCtxBuilder};
15
15
use wasmtime_wasi:: preview1:: WasiP1Ctx ;
16
16
use wasmtime_wasi:: { DirPerms , FilePerms } ;
17
17
18
+ #[ derive( Clone ) ]
19
+ struct MappedDirectory {
20
+ host_path : String ,
21
+ guest_path : String ,
22
+ dir_perms : DirPerms ,
23
+ file_perms : FilePerms ,
24
+ }
25
+
18
26
enum ReadStream {
19
27
Inherit ,
20
28
Path ( Opaque < RString > ) ,
@@ -54,7 +62,7 @@ struct WasiConfigInner {
54
62
env : Option < Opaque < RHash > > ,
55
63
args : Option < Opaque < RArray > > ,
56
64
deterministic : bool ,
57
- mapped_directories : Option < Opaque < RArray > > ,
65
+ mapped_directories : Vec < MappedDirectory > ,
58
66
}
59
67
60
68
impl WasiConfigInner {
@@ -74,9 +82,6 @@ impl WasiConfigInner {
74
82
if let Some ( v) = self . args . as_ref ( ) {
75
83
marker. mark ( * v) ;
76
84
}
77
- if let Some ( v) = self . mapped_directories . as_ref ( ) {
78
- marker. mark ( * v) ;
79
- }
80
85
}
81
86
}
82
87
@@ -254,24 +259,47 @@ impl WasiConfig {
254
259
guest_path : RString ,
255
260
dir_perms : Symbol ,
256
261
file_perms : Symbol ,
257
- ) -> RbSelf {
258
- let mapped_directory = RArray :: new ( ) ;
259
- mapped_directory. push ( host_path) . unwrap ( ) ;
260
- mapped_directory. push ( guest_path) . unwrap ( ) ;
261
- mapped_directory. push ( dir_perms) . unwrap ( ) ;
262
- mapped_directory. push ( file_perms) . unwrap ( ) ;
262
+ ) -> Result < RbSelf , Error > {
263
+ let host_path = host_path. to_string ( ) . unwrap ( ) ;
264
+ let guest_path = guest_path. to_string ( ) . unwrap ( ) ;
265
+ let dir_perms_str = dir_perms. name ( ) . unwrap ( ) . to_string ( ) ;
266
+ let file_perms_str = file_perms. name ( ) . unwrap ( ) . to_string ( ) ;
267
+
268
+ let dir_perms = match dir_perms_str. as_str ( ) {
269
+ "read" => DirPerms :: READ ,
270
+ "mutate" => DirPerms :: MUTATE ,
271
+ "all" => DirPerms :: all ( ) ,
272
+ _ => {
273
+ return Err ( error ! (
274
+ "Invalid dir_perms: {}. Use one of :read, :mutate, or :all" ,
275
+ dir_perms_str
276
+ ) )
277
+ }
278
+ } ;
279
+
280
+ let file_perms = match file_perms_str. as_str ( ) {
281
+ "read" => FilePerms :: READ ,
282
+ "write" => FilePerms :: WRITE ,
283
+ "all" => FilePerms :: all ( ) ,
284
+ _ => {
285
+ return Err ( error ! (
286
+ "Invalid file_perms: {}. Use one of :read, :write, or :all" ,
287
+ file_perms_str
288
+ ) )
289
+ }
290
+ } ;
263
291
264
- let init_directory = RArray :: new ( ) ;
292
+ let mapped_dir = MappedDirectory {
293
+ host_path,
294
+ guest_path,
295
+ dir_perms,
296
+ file_perms,
297
+ } ;
265
298
266
299
let mut inner = rb_self. inner . borrow_mut ( ) ;
267
- if inner. mapped_directories . is_none ( ) {
268
- inner. mapped_directories = Some ( init_directory. into ( ) ) ;
269
- }
300
+ inner. mapped_directories . push ( mapped_dir) ;
270
301
271
- let ruby = Ruby :: get ( ) . unwrap ( ) ;
272
- let mapped_directories = ruby. get_inner ( inner. mapped_directories . unwrap ( ) ) ;
273
- mapped_directories. push ( mapped_directory) . unwrap ( ) ;
274
- rb_self
302
+ Ok ( rb_self)
275
303
}
276
304
277
305
pub fn build_p1 ( & self , ruby : & Ruby ) -> Result < WasiP1Ctx , Error > {
@@ -358,61 +386,15 @@ impl WasiConfig {
358
386
deterministic_wasi_ctx:: add_determinism_to_wasi_ctx_builder ( & mut builder) ;
359
387
}
360
388
361
- if let Some ( mapped_directories) = inner. mapped_directories . as_ref ( ) {
362
- for item in unsafe { ruby. get_inner ( * mapped_directories) . as_slice ( ) } {
363
- let mapped_directory = RArray :: try_convert ( * item) ?;
364
- if mapped_directory. len ( ) == 4 {
365
- let host_path =
366
- RString :: try_convert ( mapped_directory. entry ( 0 ) ?) ?. to_string ( ) ?;
367
- let guest_path =
368
- RString :: try_convert ( mapped_directory. entry ( 1 ) ?) ?. to_string ( ) ?;
369
- let dir_perms = Symbol :: from_value ( mapped_directory. entry ( 2 ) ?)
370
- . unwrap ( )
371
- . name ( ) ?;
372
- let file_perms = Symbol :: from_value ( mapped_directory. entry ( 3 ) ?)
373
- . unwrap ( )
374
- . name ( ) ?;
375
-
376
- let host_path_dir = Path :: new ( & host_path) ;
377
- let guest_path_path = guest_path. as_str ( ) ;
378
-
379
- // Convert to FilePerms and DirPerms enums
380
- let dir_perms_flags;
381
- match dir_perms {
382
- std:: borrow:: Cow :: Borrowed ( "read" ) => dir_perms_flags = DirPerms :: READ ,
383
- std:: borrow:: Cow :: Borrowed ( "mutate" ) => dir_perms_flags = DirPerms :: MUTATE ,
384
- std:: borrow:: Cow :: Borrowed ( "all" ) => dir_perms_flags = DirPerms :: all ( ) ,
385
- _ => {
386
- return Err ( error ! (
387
- "Invalid dir_perms: {}. Use one of :read, :mutate, or :all" ,
388
- dir_perms
389
- ) )
390
- }
391
- }
392
-
393
- let file_perms_flags;
394
- match file_perms {
395
- std:: borrow:: Cow :: Borrowed ( "read" ) => file_perms_flags = FilePerms :: READ ,
396
- std:: borrow:: Cow :: Borrowed ( "write" ) => file_perms_flags = FilePerms :: WRITE ,
397
- std:: borrow:: Cow :: Borrowed ( "all" ) => file_perms_flags = FilePerms :: all ( ) ,
398
- _ => {
399
- return Err ( error ! (
400
- "Invalid file_perms: {}. Use one of :read, :write, or :all" ,
401
- file_perms
402
- ) )
403
- }
404
- }
405
-
406
- builder
407
- . preopened_dir (
408
- host_path_dir,
409
- guest_path_path,
410
- dir_perms_flags,
411
- file_perms_flags,
412
- )
413
- . map_err ( |e| error ! ( "{}" , e) ) ?;
414
- }
415
- }
389
+ for mapped_dir in & inner. mapped_directories {
390
+ builder
391
+ . preopened_dir (
392
+ Path :: new ( & mapped_dir. host_path ) ,
393
+ & mapped_dir. guest_path ,
394
+ mapped_dir. dir_perms ,
395
+ mapped_dir. file_perms ,
396
+ )
397
+ . map_err ( |e| error ! ( "{}" , e) ) ?;
416
398
}
417
399
418
400
Ok ( builder)
0 commit comments