1
1
use super :: root;
2
2
use crate :: error;
3
3
use crate :: helpers:: OutputLimitedBuffer ;
4
+ use crate :: ruby_api:: convert:: ToValType ;
5
+ use crate :: { define_rb_intern, helpers:: SymbolEnum } ;
6
+ use lazy_static:: lazy_static;
4
7
use magnus:: {
5
8
class, function, gc:: Marker , method, typed_data:: Obj , value:: Opaque , DataTypeFunctions , Error ,
6
- Module , Object , RArray , RHash , RString , Ruby , Symbol , TryConvert , TypedData ,
9
+ IntoValue , Module , Object , RArray , RHash , RString , Ruby , Symbol , TryConvert , TypedData , Value ,
7
10
} ;
8
11
use rb_sys:: ruby_rarray_flags:: RARRAY_EMBED_FLAG ;
9
12
use std:: cell:: RefCell ;
13
+ use std:: convert:: TryFrom ;
10
14
use std:: fs;
11
15
use std:: path:: Path ;
12
16
use std:: { fs:: File , path:: PathBuf } ;
@@ -15,6 +19,37 @@ use wasmtime_wasi::p2::{OutputFile, WasiCtx, WasiCtxBuilder};
15
19
use wasmtime_wasi:: preview1:: WasiP1Ctx ;
16
20
use wasmtime_wasi:: { DirPerms , FilePerms } ;
17
21
22
+ define_rb_intern ! (
23
+ READ => "read" ,
24
+ WRITE => "write" ,
25
+ MUTATE => "mutate" ,
26
+ ALL => "all" ,
27
+ ) ;
28
+
29
+ lazy_static ! {
30
+ static ref FILE_PERMS_MAPPING : SymbolEnum <' static , FilePerms > = {
31
+ let mapping = vec![
32
+ ( * READ , FilePerms :: READ ) ,
33
+ ( * WRITE , FilePerms :: WRITE ) ,
34
+ ( * ALL , FilePerms :: all( ) ) ,
35
+ ] ;
36
+
37
+ SymbolEnum :: new( ":file_perms" , mapping)
38
+ } ;
39
+ static ref DIR_PERMS_MAPPING : SymbolEnum <' static , DirPerms > = {
40
+ let mapping = vec![
41
+ ( * READ , DirPerms :: READ ) ,
42
+ ( * MUTATE , DirPerms :: MUTATE ) ,
43
+ ( * ALL , DirPerms :: all( ) ) ,
44
+ ] ;
45
+
46
+ SymbolEnum :: new( ":dir_perms" , mapping)
47
+ } ;
48
+ }
49
+
50
+ struct PermsSymbolEnum ( Symbol ) ;
51
+
52
+ /// A Rust struct to represent a mapped directory configuration
18
53
#[ derive( Clone ) ]
19
54
struct MappedDirectory {
20
55
host_path : String ,
@@ -85,6 +120,20 @@ impl WasiConfigInner {
85
120
}
86
121
}
87
122
123
+ impl TryFrom < PermsSymbolEnum > for DirPerms {
124
+ type Error = magnus:: Error ;
125
+ fn try_from ( value : PermsSymbolEnum ) -> Result < Self , Error > {
126
+ DIR_PERMS_MAPPING . get ( value. 0 . into_value ( ) )
127
+ }
128
+ }
129
+
130
+ impl TryFrom < PermsSymbolEnum > for FilePerms {
131
+ type Error = magnus:: Error ;
132
+ fn try_from ( value : PermsSymbolEnum ) -> Result < Self , Error > {
133
+ FILE_PERMS_MAPPING . get ( value. 0 . into_value ( ) )
134
+ }
135
+ }
136
+
88
137
/// @yard
89
138
/// WASI config to be sent as {Store#new}’s +wasi_config+ keyword argument.
90
139
///
@@ -262,32 +311,8 @@ impl WasiConfig {
262
311
) -> Result < RbSelf , Error > {
263
312
let host_path = host_path. to_string ( ) . unwrap ( ) ;
264
313
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
- } ;
314
+ let dir_perms: DirPerms = PermsSymbolEnum ( dir_perms) . try_into ( ) ?;
315
+ let file_perms: FilePerms = PermsSymbolEnum ( file_perms) . try_into ( ) ?;
291
316
292
317
let mapped_dir = MappedDirectory {
293
318
host_path,
0 commit comments