1- use std:: path:: PathBuf ;
1+ use std:: { collections :: HashMap , path:: PathBuf } ;
22
33use magnus:: {
4- eval, exception, function, method,
5- prelude:: * ,
6- value:: { self , InnerValue } ,
7- wrap, Error , ExceptionClass , RModule , Ruby ,
4+ eval, exception, function, method, prelude:: * , value:: { self , InnerValue } , wrap, Error , ExceptionClass , RModule , Ruby
85} ;
96use structopt:: StructOpt ;
107use wizer:: Wizer ;
@@ -142,6 +139,84 @@ impl ComponentLink {
142139 }
143140}
144141
142+ #[ wrap( class = "RubyWasmExt::ComponentEncode" ) ]
143+ struct ComponentEncode ( std:: cell:: RefCell < Option < wit_component:: ComponentEncoder > > ) ;
144+
145+ impl ComponentEncode {
146+ fn new ( ) -> Self {
147+ Self ( std:: cell:: RefCell :: new ( Some ( wit_component:: ComponentEncoder :: default ( ) ) ) )
148+ }
149+
150+ fn encoder ( & self , body : impl FnOnce ( wit_component:: ComponentEncoder ) -> Result < wit_component:: ComponentEncoder , Error > ) -> Result < ( ) , Error > {
151+ let mut encoder = self . 0 . take ( ) . ok_or_else ( || {
152+ Error :: new (
153+ exception:: standard_error ( ) ,
154+ "encoder is already consumed" . to_string ( ) ,
155+ )
156+ } ) ?;
157+ encoder = body ( encoder) ?;
158+ self . 0 . replace ( Some ( encoder) ) ;
159+ Ok ( ( ) )
160+ }
161+
162+ fn validate ( & self , validate : bool ) -> Result < ( ) , Error > {
163+ self . encoder ( |encoder| {
164+ Ok ( encoder. validate ( validate) )
165+ } )
166+ }
167+
168+ fn adapter ( & self , name : String , module : bytes:: Bytes ) -> Result < ( ) , Error > {
169+ self . encoder ( |encoder| {
170+ encoder. adapter ( & name, & module) . map_err ( |e| {
171+ Error :: new (
172+ exception:: standard_error ( ) ,
173+ format ! ( "failed to encode adapter: {}" , e) ,
174+ )
175+ } )
176+ } )
177+ }
178+
179+ fn module ( & self , module : bytes:: Bytes ) -> Result < ( ) , Error > {
180+ self . encoder ( |encoder| {
181+ encoder. module ( & module) . map_err ( |e| {
182+ Error :: new (
183+ exception:: standard_error ( ) ,
184+ format ! ( "failed to encode module: {}" , e) ,
185+ )
186+ } )
187+ } )
188+ }
189+
190+ fn realloc_via_memory_grow ( & self , realloc : bool ) -> Result < ( ) , Error > {
191+ self . encoder ( |encoder| {
192+ Ok ( encoder. realloc_via_memory_grow ( realloc) )
193+ } )
194+ }
195+
196+ fn import_name_map ( & self , map : HashMap < String , String > ) -> Result < ( ) , Error > {
197+ self . encoder ( |encoder| {
198+ Ok ( encoder. import_name_map ( map) )
199+ } )
200+ }
201+
202+ fn encode ( & self ) -> Result < bytes:: Bytes , Error > {
203+ // Take the encoder out of the cell and consume it
204+ let encoder = self . 0 . borrow_mut ( ) . take ( ) . ok_or_else ( || {
205+ Error :: new (
206+ exception:: standard_error ( ) ,
207+ "encoder is already consumed" . to_string ( ) ,
208+ )
209+ } ) ?;
210+ let encoded = encoder. encode ( ) . map_err ( |e| {
211+ Error :: new (
212+ exception:: standard_error ( ) ,
213+ format ! ( "failed to encode component: {}" , e) ,
214+ )
215+ } ) ?;
216+ Ok ( encoded. into ( ) )
217+ }
218+ }
219+
145220#[ magnus:: init]
146221fn init ( ruby : & Ruby ) -> Result < ( ) , Error > {
147222 let module = RUBY_WASM . get_inner_with ( ruby) ;
@@ -165,5 +240,14 @@ fn init(ruby: &Ruby) -> Result<(), Error> {
165240 component_link. define_method ( "use_built_in_libdl" , method ! ( ComponentLink :: use_built_in_libdl, 1 ) ) ?;
166241 component_link. define_method ( "encode" , method ! ( ComponentLink :: encode, 0 ) ) ?;
167242
243+ let component_encode = module. define_class ( "ComponentEncode" , ruby. class_object ( ) ) ?;
244+ component_encode. define_singleton_method ( "new" , function ! ( ComponentEncode :: new, 0 ) ) ?;
245+ component_encode. define_method ( "validate" , method ! ( ComponentEncode :: validate, 1 ) ) ?;
246+ component_encode. define_method ( "adapter" , method ! ( ComponentEncode :: adapter, 2 ) ) ?;
247+ component_encode. define_method ( "module" , method ! ( ComponentEncode :: module, 1 ) ) ?;
248+ component_encode. define_method ( "realloc_via_memory_grow" , method ! ( ComponentEncode :: realloc_via_memory_grow, 1 ) ) ?;
249+ component_encode. define_method ( "import_name_map" , method ! ( ComponentEncode :: import_name_map, 1 ) ) ?;
250+ component_encode. define_method ( "encode" , method ! ( ComponentEncode :: encode, 0 ) ) ?;
251+
168252 Ok ( ( ) )
169253}
0 commit comments