@@ -2189,7 +2189,7 @@ pub mod serde {
2189
2189
{
2190
2190
if v == "Nil" {
2191
2191
//`VariantDispatch::Nil` could be represented as the string "Nil"
2192
- return Ok ( Variant :: new ( ) )
2192
+ return Ok ( Variant :: new ( ) ) ;
2193
2193
}
2194
2194
Ok ( v. to_variant ( ) )
2195
2195
}
@@ -2224,14 +2224,14 @@ pub mod serde {
2224
2224
{
2225
2225
Ok ( ( ) . to_variant ( ) )
2226
2226
}
2227
-
2227
+
2228
2228
fn visit_newtype_struct < D > ( self , deserializer : D ) -> Result < Self :: Value , D :: Error >
2229
2229
where
2230
2230
D : Deserializer < ' de > ,
2231
2231
{
2232
2232
deserializer. deserialize_any ( VariantVisitor )
2233
2233
}
2234
-
2234
+
2235
2235
fn visit_seq < A > ( self , seq : A ) -> Result < Self :: Value , <A as SeqAccess < ' de > >:: Error >
2236
2236
where
2237
2237
A : SeqAccess < ' de > ,
@@ -2241,7 +2241,7 @@ pub mod serde {
2241
2241
. visit_seq ( seq)
2242
2242
. map ( VariantArray :: < Unique > :: owned_to_variant)
2243
2243
}
2244
-
2244
+
2245
2245
fn visit_map < A > ( self , map : A ) -> Result < Self :: Value , <A as MapAccess < ' de > >:: Error >
2246
2246
where
2247
2247
A : MapAccess < ' de > ,
@@ -2250,157 +2250,26 @@ pub mod serde {
2250
2250
let len = dict. len ( ) ;
2251
2251
if len == 1 {
2252
2252
let ( key, value) = dict. iter ( ) . next ( ) . unwrap ( ) ;
2253
- if let Some ( s) = key. try_to_string ( ) {
2254
- if s == value. get_type ( ) . name ( ) {
2255
- return Ok ( value) ;
2256
- } else if s == "elements" {
2257
- match value. dispatch ( ) {
2258
- VariantDispatch :: Vector3Array ( arr) => {
2259
- if arr. len ( ) == 3 {
2260
- return Ok ( Basis {
2261
- elements : [ arr. get ( 0 ) , arr. get ( 1 ) , arr. get ( 2 ) ] ,
2262
- }
2263
- . to_variant ( ) ) ;
2264
- }
2265
- }
2266
- VariantDispatch :: VariantArray ( arr) => {
2267
- if arr. len ( ) == 3 {
2268
- if let Some ( e0) = arr. get ( 0 ) . try_to_vector3 ( ) {
2269
- if let Some ( e1) = arr. get ( 1 ) . try_to_vector3 ( ) {
2270
- if let Some ( e2) = arr. get ( 2 ) . try_to_vector3 ( ) {
2271
- return Ok ( Basis {
2272
- elements : [ e0, e1, e2] ,
2273
- }
2274
- . to_variant ( ) ) ;
2275
- }
2276
- }
2277
- }
2278
- }
2279
- }
2280
- _ => { }
2281
- }
2282
- } else if value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) {
2283
- match & * s {
2284
- "Object" => return Ok ( Variant :: new ( ) ) ,
2285
- "Rid" => return Ok ( Rid :: new ( ) . to_variant ( ) ) ,
2286
- _ => { }
2287
- }
2288
- } else if let Some ( arr) = value. try_to_array ( ) {
2289
- if let Some ( s) = s. strip_suffix ( "Array" ) {
2290
- match s {
2291
- "Variant" => return Ok ( value) , //for completeness, should have been handled by first condition
2292
- "Byte" => {
2293
- return Ok ( ByteArray :: from_variant_array ( & arr) . to_variant ( ) )
2294
- }
2295
- "Int32" => {
2296
- return Ok ( Int32Array :: from_variant_array ( & arr) . to_variant ( ) )
2297
- }
2298
- "Float32" => {
2299
- return Ok ( Float32Array :: from_variant_array ( & arr) . to_variant ( ) )
2300
- }
2301
- "Vector2" => {
2302
- return Ok ( Vector2Array :: from_variant_array ( & arr) . to_variant ( ) )
2303
- }
2304
- "Vector3" => {
2305
- return Ok ( Vector3Array :: from_variant_array ( & arr) . to_variant ( ) )
2306
- }
2307
- "Color" => {
2308
- return Ok ( ColorArray :: from_variant_array ( & arr) . to_variant ( ) )
2309
- }
2310
- _ => { }
2311
- }
2312
- }
2253
+ if let Some ( key) = key. try_to_string ( ) {
2254
+ if let Some ( v) = string_tagged ( & key, value) {
2255
+ return Ok ( v) ;
2313
2256
}
2314
- } else if let Some ( i) = key. try_to_i64 ( ) {
2315
- if i == value. get_type ( ) as i64 {
2316
- return Ok ( value) ;
2317
- } else if value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) {
2318
- if i == VariantType :: Object as i64 {
2319
- return Ok ( Variant :: new ( ) ) ;
2320
- } else if i == VariantType :: Rid as i64 {
2321
- return Ok ( Rid :: new ( ) . to_variant ( ) ) ;
2322
- }
2323
- } else if let Some ( arr) = value. try_to_array ( ) {
2324
- if i == VariantType :: ByteArray as i64 {
2325
- return Ok ( ByteArray :: from_variant_array ( & arr) . to_variant ( ) ) ;
2326
- } else if i == VariantType :: Int32Array as i64 {
2327
- return Ok ( Int32Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2328
- } else if i == VariantType :: Float32Array as i64 {
2329
- return Ok ( Float32Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2330
- } else if i == VariantType :: Vector2Array as i64 {
2331
- return Ok ( Vector2Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2332
- } else if i == VariantType :: Vector3Array as i64 {
2333
- return Ok ( Vector3Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2334
- } else if i == VariantType :: ColorArray as i64 {
2335
- return Ok ( ColorArray :: from_variant_array ( & arr) . to_variant ( ) ) ;
2336
- }
2257
+ } else if let Some ( key) = key. try_to_i64 ( ) {
2258
+ if let Some ( v) = int_tagged ( key, value) {
2259
+ return Ok ( v) ;
2337
2260
}
2338
2261
}
2339
2262
} else if len == 2 {
2340
- if let Some ( x) = dict. get ( "x" ) . try_to_f64 ( ) {
2341
- if let Some ( y) = dict. get ( "y" ) . try_to_f64 ( ) {
2342
- return Ok ( Vector2 :: new ( x as f32 , y as f32 ) . to_variant ( ) ) ;
2343
- }
2344
- } else {
2345
- if let Some ( normal) = dict. get ( "normal" ) . try_to_vector3 ( ) {
2346
- if let Some ( d) = dict. get ( "d" ) . try_to_f64 ( ) {
2347
- return Ok ( Plane :: new ( normal, d as f32 ) . to_variant ( ) ) ;
2348
- }
2349
- }
2350
- match dict. get ( "position" ) . dispatch ( ) {
2351
- VariantDispatch :: Vector2 ( position) => {
2352
- if let Some ( size) = dict. get ( "size" ) . try_to_vector2 ( ) {
2353
- return Ok ( Rect2 { position, size } . to_variant ( ) ) ;
2354
- }
2355
- }
2356
- VariantDispatch :: Vector3 ( position) => {
2357
- if let Some ( size) = dict. get ( "size" ) . try_to_vector3 ( ) {
2358
- return Ok ( Aabb { position, size } . to_variant ( ) ) ;
2359
- }
2360
- }
2361
- _ => { }
2362
- }
2263
+ if let Some ( v) = vec2_plane_rect2_or_aabb ( & dict) {
2264
+ return Ok ( v) ;
2363
2265
}
2364
2266
} else if len == 3 {
2365
- match dict. get ( "x" ) . dispatch ( ) {
2366
- VariantDispatch :: F64 ( x) => {
2367
- if let Some ( y) = dict. get ( "y" ) . try_to_f64 ( ) {
2368
- if let Some ( z) = dict. get ( "z" ) . try_to_f64 ( ) {
2369
- return Ok ( Vector3 :: new ( x as f32 , y as f32 , z as f32 ) . to_variant ( ) ) ;
2370
- }
2371
- }
2372
- }
2373
- VariantDispatch :: Vector2 ( x) => {
2374
- if let Some ( y) = dict. get ( "y" ) . try_to_vector2 ( ) {
2375
- if let Some ( origin) = dict. get ( "origin" ) . try_to_vector2 ( ) {
2376
- return Ok ( Transform2D { x, y, origin } . to_variant ( ) ) ;
2377
- }
2378
- }
2379
- }
2380
- _ => { }
2267
+ if let Some ( v) = vec3_or_xform2d ( & dict) {
2268
+ return Ok ( v) ;
2381
2269
}
2382
2270
} else if len == 4 {
2383
- if let Some ( x) = dict. get ( "x" ) . try_to_f64 ( ) {
2384
- if let Some ( y) = dict. get ( "y" ) . try_to_f64 ( ) {
2385
- if let Some ( z) = dict. get ( "z" ) . try_to_f64 ( ) {
2386
- if let Some ( w) = dict. get ( "w" ) . try_to_f64 ( ) {
2387
- return Ok (
2388
- Quat :: new ( x as f32 , y as f32 , z as f32 , w as f32 ) . to_variant ( )
2389
- ) ;
2390
- }
2391
- }
2392
- }
2393
- } else if let Some ( r) = dict. get ( "r" ) . try_to_f64 ( ) {
2394
- if let Some ( g) = dict. get ( "g" ) . try_to_f64 ( ) {
2395
- if let Some ( b) = dict. get ( "b" ) . try_to_f64 ( ) {
2396
- if let Some ( a) = dict. get ( "a" ) . try_to_f64 ( ) {
2397
- return Ok ( Color :: from_rgba (
2398
- r as f32 , g as f32 , b as f32 , a as f32 ,
2399
- )
2400
- . to_variant ( ) ) ;
2401
- }
2402
- }
2403
- }
2271
+ if let Some ( v) = quat_or_color ( & dict) {
2272
+ return Ok ( v) ;
2404
2273
}
2405
2274
}
2406
2275
@@ -2417,6 +2286,167 @@ pub mod serde {
2417
2286
deserializer. deserialize_any ( VariantVisitor )
2418
2287
}
2419
2288
}
2289
+
2290
+ fn string_tagged ( key : & str , value : Variant ) -> Option < Variant > {
2291
+ let s = key;
2292
+ if s == value. get_type ( ) . name ( ) {
2293
+ return Some ( value) ;
2294
+ } else if s == "elements" {
2295
+ match value. dispatch ( ) {
2296
+ VariantDispatch :: Vector3Array ( arr) => {
2297
+ if arr. len ( ) == 3 {
2298
+ return Some (
2299
+ Basis {
2300
+ elements : [ arr. get ( 0 ) , arr. get ( 1 ) , arr. get ( 2 ) ] ,
2301
+ }
2302
+ . to_variant ( ) ,
2303
+ ) ;
2304
+ }
2305
+ }
2306
+ VariantDispatch :: VariantArray ( arr) => {
2307
+ if arr. len ( ) == 3 {
2308
+ if let Some ( e0) = arr. get ( 0 ) . try_to_vector3 ( ) {
2309
+ if let Some ( e1) = arr. get ( 1 ) . try_to_vector3 ( ) {
2310
+ if let Some ( e2) = arr. get ( 2 ) . try_to_vector3 ( ) {
2311
+ return Some (
2312
+ Basis {
2313
+ elements : [ e0, e1, e2] ,
2314
+ }
2315
+ . to_variant ( ) ,
2316
+ ) ;
2317
+ }
2318
+ }
2319
+ }
2320
+ }
2321
+ }
2322
+ _ => { }
2323
+ }
2324
+ } else if value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) {
2325
+ match & * s {
2326
+ "Object" => return Some ( Variant :: new ( ) ) ,
2327
+ "Rid" => return Some ( Rid :: new ( ) . to_variant ( ) ) ,
2328
+ _ => { }
2329
+ }
2330
+ } else if let Some ( arr) = value. try_to_array ( ) {
2331
+ if let Some ( s) = s. strip_suffix ( "Array" ) {
2332
+ match s {
2333
+ "Variant" => return Some ( value) , //for completeness, should have been handled by first condition
2334
+ "Byte" => return Some ( ByteArray :: from_variant_array ( & arr) . to_variant ( ) ) ,
2335
+ "Int32" => return Some ( Int32Array :: from_variant_array ( & arr) . to_variant ( ) ) ,
2336
+ "Float32" => return Some ( Float32Array :: from_variant_array ( & arr) . to_variant ( ) ) ,
2337
+ "Vector2" => return Some ( Vector2Array :: from_variant_array ( & arr) . to_variant ( ) ) ,
2338
+ "Vector3" => return Some ( Vector3Array :: from_variant_array ( & arr) . to_variant ( ) ) ,
2339
+ "Color" => return Some ( ColorArray :: from_variant_array ( & arr) . to_variant ( ) ) ,
2340
+ _ => { }
2341
+ }
2342
+ }
2343
+ }
2344
+ None
2345
+ }
2346
+
2347
+ fn int_tagged ( key : i64 , value : Variant ) -> Option < Variant > {
2348
+ let i = key;
2349
+ if i == value. get_type ( ) as i64 {
2350
+ return Some ( value) ;
2351
+ } else if value. get_type ( ) == ( ) . to_variant ( ) . get_type ( ) {
2352
+ if i == VariantType :: Object as i64 {
2353
+ return Some ( Variant :: new ( ) ) ;
2354
+ } else if i == VariantType :: Rid as i64 {
2355
+ return Some ( Rid :: new ( ) . to_variant ( ) ) ;
2356
+ }
2357
+ } else if let Some ( arr) = value. try_to_array ( ) {
2358
+ if i == VariantType :: ByteArray as i64 {
2359
+ return Some ( ByteArray :: from_variant_array ( & arr) . to_variant ( ) ) ;
2360
+ } else if i == VariantType :: Int32Array as i64 {
2361
+ return Some ( Int32Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2362
+ } else if i == VariantType :: Float32Array as i64 {
2363
+ return Some ( Float32Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2364
+ } else if i == VariantType :: Vector2Array as i64 {
2365
+ return Some ( Vector2Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2366
+ } else if i == VariantType :: Vector3Array as i64 {
2367
+ return Some ( Vector3Array :: from_variant_array ( & arr) . to_variant ( ) ) ;
2368
+ } else if i == VariantType :: ColorArray as i64 {
2369
+ return Some ( ColorArray :: from_variant_array ( & arr) . to_variant ( ) ) ;
2370
+ }
2371
+ }
2372
+ None
2373
+ }
2374
+
2375
+ fn vec2_plane_rect2_or_aabb ( dict : & Dictionary < Unique > ) -> Option < Variant > {
2376
+ if let Some ( x) = get_f64 ( & dict, "x" ) {
2377
+ if let Some ( y) = get_f64 ( & dict, "y" ) {
2378
+ return Some ( Vector2 :: new ( x as f32 , y as f32 ) . to_variant ( ) ) ;
2379
+ }
2380
+ } else {
2381
+ if let Some ( normal) = dict. get ( "normal" ) . try_to_vector3 ( ) {
2382
+ if let Some ( d) = get_f64 ( & dict, "d" ) {
2383
+ return Some ( Plane :: new ( normal, d as f32 ) . to_variant ( ) ) ;
2384
+ }
2385
+ }
2386
+ match dict. get ( "position" ) . dispatch ( ) {
2387
+ VariantDispatch :: Vector2 ( position) => {
2388
+ if let Some ( size) = dict. get ( "size" ) . try_to_vector2 ( ) {
2389
+ return Some ( Rect2 { position, size } . to_variant ( ) ) ;
2390
+ }
2391
+ }
2392
+ VariantDispatch :: Vector3 ( position) => {
2393
+ if let Some ( size) = dict. get ( "size" ) . try_to_vector3 ( ) {
2394
+ return Some ( Aabb { position, size } . to_variant ( ) ) ;
2395
+ }
2396
+ }
2397
+ _ => { }
2398
+ }
2399
+ }
2400
+ None
2401
+ }
2402
+
2403
+ fn vec3_or_xform2d ( dict : & Dictionary < Unique > ) -> Option < Variant > {
2404
+ if let Some ( x) = get_f64 ( & dict, "x" ) {
2405
+ if let Some ( y) = get_f64 ( & dict, "y" ) {
2406
+ if let Some ( z) = get_f64 ( & dict, "z" ) {
2407
+ return Some ( Vector3 :: new ( x as f32 , y as f32 , z as f32 ) . to_variant ( ) ) ;
2408
+ }
2409
+ }
2410
+ } else if let Some ( x) = dict. get ( "x" ) . try_to_vector2 ( ) {
2411
+ if let Some ( y) = dict. get ( "y" ) . try_to_vector2 ( ) {
2412
+ if let Some ( origin) = dict. get ( "origin" ) . try_to_vector2 ( ) {
2413
+ return Some ( Transform2D { x, y, origin } . to_variant ( ) ) ;
2414
+ }
2415
+ }
2416
+ }
2417
+ None
2418
+ }
2419
+
2420
+ fn quat_or_color ( dict : & Dictionary < Unique > ) -> Option < Variant > {
2421
+ if let Some ( x) = get_f64 ( & dict, "x" ) {
2422
+ if let Some ( y) = get_f64 ( & dict, "y" ) {
2423
+ if let Some ( z) = get_f64 ( & dict, "z" ) {
2424
+ if let Some ( w) = get_f64 ( & dict, "w" ) {
2425
+ return Some (
2426
+ Quat :: new ( x as f32 , y as f32 , z as f32 , w as f32 ) . to_variant ( ) ,
2427
+ ) ;
2428
+ }
2429
+ }
2430
+ }
2431
+ } else if let Some ( r) = get_f64 ( & dict, "r" ) {
2432
+ if let Some ( g) = get_f64 ( & dict, "g" ) {
2433
+ if let Some ( b) = get_f64 ( & dict, "b" ) {
2434
+ if let Some ( a) = get_f64 ( & dict, "a" ) {
2435
+ return Some (
2436
+ Color :: from_rgba ( r as f32 , g as f32 , b as f32 , a as f32 ) . to_variant ( ) ,
2437
+ ) ;
2438
+ }
2439
+ }
2440
+ }
2441
+ }
2442
+ None
2443
+ }
2444
+
2445
+ fn get_f64 < Access : ThreadAccess > ( dict : & Dictionary < Access > , key : impl ToVariant + ToVariantEq ) -> Option < f64 > {
2446
+ dict
2447
+ . try_get ( key)
2448
+ . and_then ( |v| v. try_to_f64 ( ) . or_else ( || v. try_to_i64 ( ) . map ( |i| i as f64 ) ) )
2449
+ }
2420
2450
}
2421
2451
2422
2452
godot_test ! (
0 commit comments