@@ -2442,6 +2442,159 @@ fn test_untagged_enum_containing_flatten() {
2442
2442
) ;
2443
2443
}
2444
2444
2445
+ #[ test]
2446
+ fn test_partially_untagged_enum ( ) {
2447
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2448
+ enum Exp {
2449
+ Lambda ( u32 , Box < Exp > ) ,
2450
+ #[ serde( untagged) ]
2451
+ App ( Box < Exp > , Box < Exp > ) ,
2452
+ #[ serde( untagged) ]
2453
+ Var ( u32 ) ,
2454
+ }
2455
+ use Exp :: * ;
2456
+
2457
+ let data = Lambda ( 0 , Box :: new ( App ( Box :: new ( Var ( 0 ) ) , Box :: new ( Var ( 0 ) ) ) ) ) ;
2458
+ assert_tokens (
2459
+ & data,
2460
+ & [
2461
+ Token :: TupleVariant {
2462
+ name : "Exp" ,
2463
+ variant : "Lambda" ,
2464
+ len : 2 ,
2465
+ } ,
2466
+ Token :: U32 ( 0 ) ,
2467
+ Token :: Tuple { len : 2 } ,
2468
+ Token :: U32 ( 0 ) ,
2469
+ Token :: U32 ( 0 ) ,
2470
+ Token :: TupleEnd ,
2471
+ Token :: TupleVariantEnd ,
2472
+ ] ,
2473
+ ) ;
2474
+ }
2475
+
2476
+ #[ test]
2477
+ fn test_partially_untagged_enum_generic ( ) {
2478
+ trait Trait < T > {
2479
+ type Assoc ;
2480
+ type Assoc2 ;
2481
+ }
2482
+
2483
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2484
+ enum E < A , B , C > where A : Trait < C , Assoc2 =B > {
2485
+ A ( A :: Assoc ) ,
2486
+ #[ serde( untagged) ]
2487
+ B ( A :: Assoc2 ) ,
2488
+ }
2489
+
2490
+ impl < T > Trait < T > for ( ) {
2491
+ type Assoc = T ;
2492
+ type Assoc2 = bool ;
2493
+ }
2494
+
2495
+ type MyE = E < ( ) , bool , u32 > ;
2496
+ use E :: * ;
2497
+
2498
+ assert_tokens :: < MyE > ( & B ( true ) , & [ Token :: Bool ( true ) ] ) ;
2499
+
2500
+ assert_tokens :: < MyE > (
2501
+ & A ( 5 ) ,
2502
+ & [
2503
+ Token :: NewtypeVariant {
2504
+ name : "E" ,
2505
+ variant : "A" ,
2506
+ } ,
2507
+ Token :: U32 ( 5 ) ,
2508
+ ] ,
2509
+ ) ;
2510
+ }
2511
+
2512
+ #[ test]
2513
+ fn test_partially_untagged_enum_desugared ( ) {
2514
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2515
+ enum Test {
2516
+ A ( u32 , u32 ) ,
2517
+ B ( u32 ) ,
2518
+ #[ serde( untagged) ]
2519
+ C ( u32 ) ,
2520
+ #[ serde( untagged) ]
2521
+ D ( u32 , u32 ) ,
2522
+ }
2523
+ use Test :: * ;
2524
+
2525
+ mod desugared {
2526
+ use super :: * ;
2527
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2528
+ pub ( super ) enum Test {
2529
+ A ( u32 , u32 ) ,
2530
+ B ( u32 ) ,
2531
+ }
2532
+ }
2533
+ use desugared:: Test as TestTagged ;
2534
+
2535
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2536
+ #[ serde( untagged) ]
2537
+ enum TestUntagged {
2538
+ Tagged ( TestTagged ) ,
2539
+ C ( u32 ) ,
2540
+ D ( u32 , u32 ) ,
2541
+ }
2542
+
2543
+ impl From < Test > for TestUntagged {
2544
+ fn from ( test : Test ) -> Self {
2545
+ match test {
2546
+ A ( x, y) => TestUntagged :: Tagged ( TestTagged :: A ( x, y) ) ,
2547
+ B ( x) => TestUntagged :: Tagged ( TestTagged :: B ( x) ) ,
2548
+ C ( x) => TestUntagged :: C ( x) ,
2549
+ D ( x, y) => TestUntagged :: D ( x, y) ,
2550
+ }
2551
+ }
2552
+ }
2553
+
2554
+ fn assert_tokens_desugared ( value : Test , tokens : & [ Token ] ) {
2555
+ assert_tokens ( & value, tokens) ;
2556
+ let desugared: TestUntagged = value. into ( ) ;
2557
+ assert_tokens ( & desugared, tokens) ;
2558
+ }
2559
+
2560
+ assert_tokens_desugared (
2561
+ A ( 0 , 1 ) ,
2562
+ & [
2563
+ Token :: TupleVariant {
2564
+ name : "Test" ,
2565
+ variant : "A" ,
2566
+ len : 2 ,
2567
+ } ,
2568
+ Token :: U32 ( 0 ) ,
2569
+ Token :: U32 ( 1 ) ,
2570
+ Token :: TupleVariantEnd ,
2571
+ ] ,
2572
+ ) ;
2573
+
2574
+ assert_tokens_desugared (
2575
+ B ( 1 ) ,
2576
+ & [
2577
+ Token :: NewtypeVariant {
2578
+ name : "Test" ,
2579
+ variant : "B" ,
2580
+ } ,
2581
+ Token :: U32 ( 1 ) ,
2582
+ ] ,
2583
+ ) ;
2584
+
2585
+ assert_tokens_desugared ( C ( 2 ) , & [ Token :: U32 ( 2 ) ] ) ;
2586
+
2587
+ assert_tokens_desugared (
2588
+ D ( 3 , 5 ) ,
2589
+ & [
2590
+ Token :: Tuple { len : 2 } ,
2591
+ Token :: U32 ( 3 ) ,
2592
+ Token :: U32 ( 5 ) ,
2593
+ Token :: TupleEnd ,
2594
+ ] ,
2595
+ ) ;
2596
+ }
2597
+
2445
2598
#[ test]
2446
2599
fn test_flatten_untagged_enum ( ) {
2447
2600
#[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
0 commit comments