File tree Expand file tree Collapse file tree 2 files changed +115
-0
lines changed Expand file tree Collapse file tree 2 files changed +115
-0
lines changed Original file line number Diff line number Diff line change
1
+ #![ allow( dead_code) ] // we do not read enum fields
2
+ use serde_derive:: Deserialize ;
3
+
4
+ #[ derive( Deserialize ) ]
5
+ pub struct Nested ;
6
+
7
+ #[ derive( Deserialize ) ]
8
+ pub enum ExternallyTagged1 {
9
+ Tuple ( f64 , String ) ,
10
+ Flatten {
11
+ #[ serde( flatten) ]
12
+ nested : Nested ,
13
+ } ,
14
+ }
15
+
16
+ #[ derive( Deserialize ) ]
17
+ pub enum ExternallyTagged2 {
18
+ Flatten {
19
+ #[ serde( flatten) ]
20
+ nested : Nested ,
21
+ } ,
22
+ Tuple ( f64 , String ) ,
23
+ }
24
+
25
+ // Internally tagged enums cannot contain tuple variants so not tested here
26
+
27
+ #[ derive( Deserialize ) ]
28
+ #[ serde( tag = "tag" , content = "content" ) ]
29
+ pub enum AdjacentlyTagged1 {
30
+ Tuple ( f64 , String ) ,
31
+ Flatten {
32
+ #[ serde( flatten) ]
33
+ nested : Nested ,
34
+ } ,
35
+ }
36
+
37
+ #[ derive( Deserialize ) ]
38
+ #[ serde( tag = "tag" , content = "content" ) ]
39
+ pub enum AdjacentlyTagged2 {
40
+ Flatten {
41
+ #[ serde( flatten) ]
42
+ nested : Nested ,
43
+ } ,
44
+ Tuple ( f64 , String ) ,
45
+ }
46
+
47
+ #[ derive( Deserialize ) ]
48
+ #[ serde( untagged) ]
49
+ pub enum Untagged1 {
50
+ Tuple ( f64 , String ) ,
51
+ Flatten {
52
+ #[ serde( flatten) ]
53
+ nested : Nested ,
54
+ } ,
55
+ }
56
+
57
+ #[ derive( Deserialize ) ]
58
+ #[ serde( untagged) ]
59
+ pub enum Untagged2 {
60
+ Flatten {
61
+ #[ serde( flatten) ]
62
+ nested : Nested ,
63
+ } ,
64
+ Tuple ( f64 , String ) ,
65
+ }
Original file line number Diff line number Diff line change @@ -2380,6 +2380,56 @@ fn test_partially_untagged_enum_desugared() {
2380
2380
) ;
2381
2381
}
2382
2382
2383
+ /// Regression test for https://github.com/serde-rs/serde/issues/1904
2384
+ #[ test]
2385
+ fn test_enum_tuple_and_struct_with_flatten ( ) {
2386
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2387
+ enum Outer {
2388
+ Tuple ( f64 , i32 ) ,
2389
+ Flatten {
2390
+ #[ serde( flatten) ]
2391
+ nested : Nested ,
2392
+ } ,
2393
+ }
2394
+
2395
+ #[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
2396
+ struct Nested {
2397
+ a : i32 ,
2398
+ b : i32 ,
2399
+ }
2400
+
2401
+ assert_tokens (
2402
+ & Outer :: Tuple ( 1.2 , 3 ) ,
2403
+ & [
2404
+ Token :: TupleVariant {
2405
+ name : "Outer" ,
2406
+ variant : "Tuple" ,
2407
+ len : 2 ,
2408
+ } ,
2409
+ Token :: F64 ( 1.2 ) ,
2410
+ Token :: I32 ( 3 ) ,
2411
+ Token :: TupleVariantEnd ,
2412
+ ] ,
2413
+ ) ;
2414
+ assert_tokens (
2415
+ & Outer :: Flatten {
2416
+ nested : Nested { a : 1 , b : 2 } ,
2417
+ } ,
2418
+ & [
2419
+ Token :: NewtypeVariant {
2420
+ name : "Outer" ,
2421
+ variant : "Flatten" ,
2422
+ } ,
2423
+ Token :: Map { len : None } ,
2424
+ Token :: Str ( "a" ) ,
2425
+ Token :: I32 ( 1 ) ,
2426
+ Token :: Str ( "b" ) ,
2427
+ Token :: I32 ( 2 ) ,
2428
+ Token :: MapEnd ,
2429
+ ] ,
2430
+ ) ;
2431
+ }
2432
+
2383
2433
#[ test]
2384
2434
fn test_partially_untagged_internally_tagged_enum ( ) {
2385
2435
#[ derive( Serialize , Deserialize , PartialEq , Debug ) ]
You can’t perform that action at this time.
0 commit comments