@@ -249,31 +249,59 @@ impl WASMVirtualMachine {
249249
250250 #[ wasm_bindgen( js_name = setStdout) ]
251251 pub fn set_stdout ( & self , stdout : JsValue ) -> Result < ( ) , JsValue > {
252+ self . set_stdstream (
253+ "stdout" ,
254+ "JSStdout" ,
255+ stdout,
256+ wasm_builtins:: sys_stdout_write_console,
257+ )
258+ }
259+
260+ #[ wasm_bindgen( js_name = setStderr) ]
261+ pub fn set_stderr ( & self , stderr : JsValue ) -> Result < ( ) , JsValue > {
262+ self . set_stdstream (
263+ "stderr" ,
264+ "JSStderr" ,
265+ stderr,
266+ wasm_builtins:: sys_stderr_write_console,
267+ )
268+ }
269+
270+ fn set_stdstream (
271+ & self ,
272+ attr : & ' static str ,
273+ class_name : & ' static str ,
274+ stream : JsValue ,
275+ console_write : fn ( & str , & VirtualMachine ) -> PyResult < ( ) > ,
276+ ) -> Result < ( ) , JsValue > {
252277 self . with_vm ( |vm, _| {
253- fn error ( ) -> JsValue {
254- TypeError :: new ( "Unknown stdout option, please pass a function or 'console'" ) . into ( )
278+ fn error ( attr : & str ) -> JsValue {
279+ TypeError :: new ( & format ! (
280+ "Unknown {attr} option, please pass a function or 'console'"
281+ ) )
282+ . into ( )
255283 }
256- use wasm_builtins:: make_stdout_object ;
257- let stdout : PyObjectRef = if let Some ( s) = stdout . as_string ( ) {
284+ use wasm_builtins:: make_stdstream_object ;
285+ let stream : PyObjectRef = if let Some ( s) = stream . as_string ( ) {
258286 match s. as_str ( ) {
259- "console" => make_stdout_object ( vm, wasm_builtins :: sys_stdout_write_console ) ,
260- _ => return Err ( error ( ) ) ,
287+ "console" => make_stdstream_object ( vm, class_name , console_write ) ,
288+ _ => return Err ( error ( attr ) ) ,
261289 }
262- } else if stdout . is_function ( ) {
263- let func = js_sys:: Function :: from ( stdout ) ;
264- make_stdout_object ( vm, move |data, vm| {
290+ } else if stream . is_function ( ) {
291+ let func = js_sys:: Function :: from ( stream ) ;
292+ make_stdstream_object ( vm, class_name , move |data, vm| {
265293 func. call1 ( & JsValue :: UNDEFINED , & data. into ( ) )
266294 . map_err ( |err| convert:: js_py_typeerror ( vm, err) ) ?;
267295 Ok ( ( ) )
268296 } )
269- } else if stdout . is_null ( ) {
270- make_stdout_object ( vm, |_, _| Ok ( ( ) ) )
271- } else if stdout . is_undefined ( ) {
272- make_stdout_object ( vm, wasm_builtins :: sys_stdout_write_console )
297+ } else if stream . is_null ( ) {
298+ make_stdstream_object ( vm, class_name , |_, _| Ok ( ( ) ) )
299+ } else if stream . is_undefined ( ) {
300+ make_stdstream_object ( vm, class_name , console_write )
273301 } else {
274- return Err ( error ( ) ) ;
302+ return Err ( error ( attr ) ) ;
275303 } ;
276- vm. sys_module . set_attr ( "stdout" , stdout , vm) . unwrap ( ) ;
304+ vm. sys_module . set_attr ( attr , stream , vm) . unwrap ( ) ;
277305 Ok ( ( ) )
278306 } ) ?
279307 }
0 commit comments