11use super :: root;
22use crate :: error;
33use crate :: helpers:: OutputLimitedBuffer ;
4+ use crate :: ruby_api:: convert:: ToValType ;
5+ use crate :: { define_rb_intern, helpers:: SymbolEnum } ;
6+ use lazy_static:: lazy_static;
47use magnus:: {
58 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 ,
710} ;
811use rb_sys:: ruby_rarray_flags:: RARRAY_EMBED_FLAG ;
912use std:: cell:: RefCell ;
13+ use std:: convert:: TryFrom ;
1014use std:: fs;
1115use std:: path:: Path ;
1216use std:: { fs:: File , path:: PathBuf } ;
@@ -15,6 +19,36 @@ use wasmtime_wasi::p2::{OutputFile, WasiCtx, WasiCtxBuilder};
1519use wasmtime_wasi:: preview1:: WasiP1Ctx ;
1620use wasmtime_wasi:: { DirPerms , FilePerms } ;
1721
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+
1852#[ derive( Clone ) ]
1953struct MappedDirectory {
2054 host_path : String ,
@@ -85,6 +119,20 @@ impl WasiConfigInner {
85119 }
86120}
87121
122+ impl TryFrom < PermsSymbolEnum > for DirPerms {
123+ type Error = magnus:: Error ;
124+ fn try_from ( value : PermsSymbolEnum ) -> Result < Self , Error > {
125+ DIR_PERMS_MAPPING . get ( value. 0 . into_value ( ) )
126+ }
127+ }
128+
129+ impl TryFrom < PermsSymbolEnum > for FilePerms {
130+ type Error = magnus:: Error ;
131+ fn try_from ( value : PermsSymbolEnum ) -> Result < Self , Error > {
132+ FILE_PERMS_MAPPING . get ( value. 0 . into_value ( ) )
133+ }
134+ }
135+
88136/// @yard
89137/// WASI config to be sent as {Store#new}’s +wasi_config+ keyword argument.
90138///
@@ -262,32 +310,8 @@ impl WasiConfig {
262310 ) -> Result < RbSelf , Error > {
263311 let host_path = host_path. to_string ( ) . unwrap ( ) ;
264312 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- } ;
313+ let dir_perms: DirPerms = PermsSymbolEnum ( dir_perms) . try_into ( ) ?;
314+ let file_perms: FilePerms = PermsSymbolEnum ( file_perms) . try_into ( ) ?;
291315
292316 let mapped_dir = MappedDirectory {
293317 host_path,
0 commit comments