1
- use js_sys;
2
1
use js_sys:: JSON :: stringify;
3
2
use js_sys:: { Array , BigInt , Object , Reflect } ;
4
3
use wasm_bindgen:: JsCast ;
@@ -42,21 +41,27 @@ pub fn js_object_from_sexp(v: Rc<SExp>) -> Result<JsValue, JsValue> {
42
41
match v. borrow ( ) {
43
42
SExp :: Nil ( _) => Ok ( JsValue :: null ( ) ) ,
44
43
SExp :: Integer ( _, i) => Ok ( JsValue :: bigint_from_str ( & i. to_string ( ) ) ) ,
45
- SExp :: QuotedString ( _, _, q) => {
46
- Ok ( JsValue :: from_str ( & Bytes :: new ( Some ( BytesFromType :: Raw ( q. clone ( ) ) ) ) . decode ( ) ) )
47
- }
48
- SExp :: Atom ( _, q) => {
49
- Ok ( JsValue :: from_str ( & Bytes :: new ( Some ( BytesFromType :: Raw ( q. clone ( ) ) ) ) . decode ( ) ) )
50
- }
44
+ SExp :: QuotedString ( _, _, q) => Ok ( JsValue :: from_str (
45
+ & Bytes :: new ( Some ( BytesFromType :: Raw ( q. clone ( ) ) ) ) . decode ( ) ,
46
+ ) ) ,
47
+ SExp :: Atom ( _, q) => Ok ( JsValue :: from_str (
48
+ & Bytes :: new ( Some ( BytesFromType :: Raw ( q. clone ( ) ) ) ) . decode ( ) ,
49
+ ) ) ,
51
50
SExp :: Cons ( _, a, b) => {
52
51
if let Some ( lst) = v. proper_list ( ) {
53
52
let array = Array :: new ( ) ;
54
- for i in 0 ..lst. len ( ) {
55
- array. set ( i as u32 , js_object_from_sexp ( Rc :: new ( lst[ i] . clone ( ) ) ) . unwrap_or_else ( |e| e) ) ;
53
+ for ( i, _) in lst. iter ( ) . enumerate ( ) {
54
+ array. set (
55
+ i as u32 ,
56
+ js_object_from_sexp ( Rc :: new ( lst[ i] . clone ( ) ) ) . unwrap_or_else ( |e| e) ,
57
+ ) ;
56
58
}
57
59
Ok ( array_to_value ( array) )
58
60
} else {
59
- t ( & js_object_from_sexp ( a. clone ( ) ) ?, & js_object_from_sexp ( b. clone ( ) ) ?)
61
+ t (
62
+ & js_object_from_sexp ( a. clone ( ) ) ?,
63
+ & js_object_from_sexp ( b. clone ( ) ) ?,
64
+ )
60
65
}
61
66
}
62
67
}
@@ -103,33 +108,37 @@ fn location(o: &Object) -> Option<Srcloc> {
103
108
line : l,
104
109
col : c,
105
110
until : get_property ( o, "until" )
106
- . and_then ( |lo| Object :: try_from ( & lo) . map ( |o| o . clone ( ) ) )
111
+ . and_then ( |lo| Object :: try_from ( & lo) . cloned ( ) )
107
112
. and_then ( |lo| location_lc_pair ( & lo) )
108
113
. map ( |( ll, lc) | Until { line : ll, col : lc } ) ,
109
114
} )
110
115
}
111
116
112
117
pub fn detect_serializable ( loc : & Srcloc , v : & JsValue ) -> Option < Rc < SExp > > {
113
118
let serialize_key = JsValue :: from_str ( "serialize" ) ;
114
- js_sys:: Reflect :: get ( v, & serialize_key) . ok ( ) . and_then ( |serialize| {
115
- Reflect :: apply ( serialize. unchecked_ref ( ) , v, & js_sys:: Array :: new ( ) ) . ok ( ) . and_then ( |array| {
116
- Array :: try_from ( array) . ok ( ) . and_then ( |array| {
117
- let mut bytes_array: Vec < u8 > = vec ! [ ] ;
118
- for item in array. iter ( ) {
119
- if let Some ( n) = item. as_f64 ( ) {
120
- if n < 0.0 || n > 255.0 {
121
- return None ;
119
+ js_sys:: Reflect :: get ( v, & serialize_key)
120
+ . ok ( )
121
+ . and_then ( |serialize| {
122
+ Reflect :: apply ( serialize. unchecked_ref ( ) , v, & js_sys:: Array :: new ( ) )
123
+ . ok ( )
124
+ . and_then ( |array| {
125
+ Array :: try_from ( array) . ok ( ) . and_then ( |array| {
126
+ let mut bytes_array: Vec < u8 > = vec ! [ ] ;
127
+ for item in array. iter ( ) {
128
+ if let Some ( n) = item. as_f64 ( ) {
129
+ if !( 0.0 ..=255.0 ) . contains ( & n) {
130
+ return None ;
131
+ }
132
+ bytes_array. push ( n as u8 ) ;
133
+ } else {
134
+ return None ;
135
+ }
122
136
}
123
- bytes_array. push ( n as u8 ) ;
124
- } else {
125
- return None ;
126
- }
127
- }
128
137
129
- return Some ( Rc :: new ( SExp :: QuotedString ( loc. clone ( ) , b'x' , bytes_array) ) ) ;
130
- } )
138
+ Some ( Rc :: new ( SExp :: QuotedString ( loc. clone ( ) , b'x' , bytes_array) ) )
139
+ } )
140
+ } )
131
141
} )
132
- } )
133
142
}
134
143
135
144
pub fn detect_convertible ( v : & JsValue ) -> Result < Rc < SExp > , JsValue > {
@@ -146,9 +155,9 @@ pub fn detect_convertible(v: &JsValue) -> Result<Rc<SExp>, JsValue> {
146
155
pub fn sexp_from_js_object ( sstart : Srcloc , v : & JsValue ) -> Option < Rc < SExp > > {
147
156
// Already converted value.
148
157
if let Ok ( res) = js_cache_value_from_js ( v) {
149
- find_cached_sexp ( res. entry , & res. content ) . map ( |result| {
150
- result. modern . clone ( )
151
- } ) . ok ( )
158
+ find_cached_sexp ( res. entry , & res. content )
159
+ . map ( | result| result . modern . clone ( ) )
160
+ . ok ( )
152
161
} else if v. is_bigint ( ) {
153
162
BigInt :: new ( v)
154
163
. ok ( )
@@ -157,30 +166,28 @@ pub fn sexp_from_js_object(sstart: Srcloc, v: &JsValue) -> Option<Rc<SExp>> {
157
166
. and_then ( |v| v. parse :: < Number > ( ) . ok ( ) )
158
167
. map ( |x| Rc :: new ( SExp :: Integer ( sstart. clone ( ) , x) ) )
159
168
} else if let Some ( fval) = v. as_f64 ( ) {
160
- ( fval as i64 ) . to_bigint ( )
169
+ ( fval as i64 )
170
+ . to_bigint ( )
161
171
. map ( |x| Rc :: new ( SExp :: Integer ( sstart. clone ( ) , x) ) )
162
172
} else if let Some ( g1_bytes) = detect_serializable ( & sstart, v) {
163
173
Some ( g1_bytes)
164
- } else if let Some ( converted) = detect_convertible ( v) . ok ( ) {
174
+ } else if let Ok ( converted) = detect_convertible ( v) {
165
175
Some ( converted)
166
176
} else if Array :: is_array ( v) {
167
177
let a = Array :: from ( v) ;
168
- let mut result_value = Rc :: new ( SExp :: Nil ( Srcloc :: start ( & "*js*" . to_string ( ) ) ) ) ;
178
+ let mut result_value = Rc :: new ( SExp :: Nil ( Srcloc :: start ( "*js*" ) ) ) ;
169
179
for i_rev in 0 ..a. length ( ) {
170
180
let i = a. length ( ) - i_rev - 1 ;
171
- match sexp_from_js_object ( sstart. clone ( ) , & a. get ( i) ) {
172
- Some ( nv) => {
173
- result_value = Rc :: new ( SExp :: Cons ( nv. loc ( ) , nv, result_value) ) ;
174
- }
175
- _ => { }
181
+ if let Some ( nv) = sexp_from_js_object ( sstart. clone ( ) , & a. get ( i) ) {
182
+ result_value = Rc :: new ( SExp :: Cons ( nv. loc ( ) , nv, result_value) ) ;
176
183
}
177
184
}
178
185
Some ( result_value)
179
186
} else {
180
187
Object :: try_from ( v)
181
188
. map ( |o| {
182
189
let loc = get_property ( o, "location" )
183
- . and_then ( |o| Object :: try_from ( & o) . map ( |o| o . clone ( ) ) )
190
+ . and_then ( |o| Object :: try_from ( & o) . cloned ( ) )
184
191
. and_then ( |o| location ( & o) )
185
192
. unwrap_or_else ( || sstart. clone ( ) ) ;
186
193
get_property ( o, "pair" )
@@ -211,21 +218,21 @@ pub fn btreemap_to_object<'a>(iter: impl Iterator<Item = (&'a String, &'a String
211
218
let entries = Array :: new ( ) ;
212
219
for pv in iter {
213
220
let pair = Array :: new ( ) ;
214
- pair. set ( 0 , JsValue :: from_str ( & pv. 0 ) ) ;
215
- pair. set ( 1 , JsValue :: from_str ( & pv. 1 ) ) ;
221
+ pair. set ( 0 , JsValue :: from_str ( pv. 0 ) ) ;
222
+ pair. set ( 1 , JsValue :: from_str ( pv. 1 ) ) ;
216
223
let pair_ref: & JsValue = pair. as_ref ( ) ;
217
224
entries. set ( entries. length ( ) , pair_ref. clone ( ) ) ;
218
225
}
219
- object_to_value ( & Object :: from_entries ( & entries) . as_ref ( ) . unwrap ( ) )
226
+ object_to_value ( Object :: from_entries ( & entries) . as_ref ( ) . unwrap ( ) )
220
227
}
221
228
222
229
pub fn read_string_to_string_map (
223
230
symbols : & js_sys:: Object ,
224
231
) -> Result < HashMap < String , String > , String > {
225
232
let mut result = HashMap :: new ( ) ;
226
- for ent in js_sys:: Object :: keys ( & symbols) . values ( ) {
233
+ for ent in js_sys:: Object :: keys ( symbols) . values ( ) {
227
234
let key = ent. unwrap ( ) . as_string ( ) . unwrap ( ) ;
228
- match get_property ( & symbols, & key) . unwrap ( ) . as_string ( ) {
235
+ match get_property ( symbols, & key) . unwrap ( ) . as_string ( ) {
229
236
Some ( val) => {
230
237
result. insert ( key, val) ;
231
238
}
0 commit comments