@@ -5,35 +5,42 @@ use std::{
55 thread,
66} ;
77
8- /// Recursively convert a `JSONValue` to a `JsValue`
9- fn to_value < ' a , C : Context < ' a > > ( cx : & mut C , value : JSONValue ) -> Handle < ' a , JsValue > {
8+ enum ToValue {
9+ Undefined ,
10+ Json ( JSONValue ) ,
11+ }
12+
13+ /// Recursively convert a `ToValue` to a `JsValue`
14+ fn to_value < ' a , C : Context < ' a > > ( cx : & mut C , value : ToValue ) -> Handle < ' a , JsValue > {
1015 match value {
11- JSONValue :: Null => cx. null ( ) . upcast :: < JsValue > ( ) ,
12- JSONValue :: Bool ( v) => cx. boolean ( v) . upcast :: < JsValue > ( ) ,
13- JSONValue :: Number ( v) => cx. number ( v. as_f64 ( ) . unwrap ( ) ) . upcast :: < JsValue > ( ) ,
14- JSONValue :: String ( v) => cx. string ( v) . upcast :: < JsValue > ( ) ,
15- JSONValue :: Array ( v) => {
16+ ToValue :: Json ( JSONValue :: Null ) => cx. null ( ) . upcast :: < JsValue > ( ) ,
17+ ToValue :: Json ( JSONValue :: Bool ( v) ) => cx. boolean ( v) . upcast :: < JsValue > ( ) ,
18+ ToValue :: Json ( JSONValue :: Number ( v) ) => cx. number ( v. as_f64 ( ) . unwrap ( ) ) . upcast :: < JsValue > ( ) ,
19+ ToValue :: Json ( JSONValue :: String ( v) ) => cx. string ( v) . upcast :: < JsValue > ( ) ,
20+ ToValue :: Json ( JSONValue :: Array ( v) ) => {
1621 let a = JsArray :: new ( cx, v. len ( ) as u32 ) ;
1722
1823 for ( i, s) in v. iter ( ) . enumerate ( ) {
19- let val = to_value ( cx, s. to_owned ( ) ) ;
24+ let val = to_value ( cx, ToValue :: Json ( s. to_owned ( ) ) ) ;
2025 a. set ( cx, i as u32 , val) . unwrap ( ) ;
2126 }
2227
2328 a. upcast :: < JsValue > ( )
2429 }
25- JSONValue :: Object ( v) => {
30+ ToValue :: Json ( JSONValue :: Object ( v) ) => {
2631 let o = cx. empty_object ( ) ;
2732
2833 for ( _, ( k, s) ) in v. iter ( ) . enumerate ( ) {
2934 let key = cx. string ( k) ;
30- let val = to_value ( cx, s. to_owned ( ) ) ;
35+ let val = to_value ( cx, ToValue :: Json ( s. to_owned ( ) ) ) ;
3136
3237 o. set ( cx, key, val) . unwrap ( ) ;
3338 }
3439
3540 o. upcast :: < JsValue > ( )
3641 }
42+
43+ ToValue :: Undefined => cx. undefined ( ) . upcast :: < JsValue > ( ) ,
3744 }
3845}
3946
@@ -104,8 +111,9 @@ impl Shovel {
104111 shovel
105112 . send ( move |context, channel| {
106113 let val = match context. eval ( & source) {
107- Ok ( v) => Ok ( v. to_json ( context) . unwrap ( ) ) ,
108- Err ( v) => Err ( v. to_json ( context) . unwrap ( ) ) ,
114+ Ok ( boa:: Value :: Undefined ) => Ok ( ToValue :: Undefined ) ,
115+ Ok ( v) => Ok ( ToValue :: Json ( v. to_json ( context) . unwrap ( ) ) ) ,
116+ Err ( v) => Err ( ToValue :: Json ( v. to_json ( context) . unwrap ( ) ) ) ,
109117 } ;
110118
111119 channel. send ( move |mut cx| {
0 commit comments