@@ -570,26 +570,38 @@ fn serde_known_vector() {
570
570
}
571
571
572
572
#[ derive( Debug , Deserialize , Serialize , PartialEq , Eq , Clone ) ]
573
- struct List {
574
- next : Option < ( usize , Box < List > ) > ,
573
+ struct List < T > {
574
+ value : T ,
575
+ next : Option < Box < List < T > > > ,
575
576
}
576
-
577
- impl List {
578
- fn empty ( ) -> Self {
579
- Self { next : None }
577
+ impl < T > List < T > {
578
+ fn head ( value : T ) -> Self {
579
+ Self { value, next : None }
580
580
}
581
581
582
- fn cons ( value : usize , tail : List ) -> Self {
582
+ fn cons ( value : T , tail : List < T > ) -> Self {
583
583
Self {
584
- next : Some ( ( value, Box :: new ( tail) ) ) ,
584
+ value,
585
+ next : Some ( Box :: new ( tail) ) ,
586
+ }
587
+ }
588
+ }
589
+ impl < T : Clone > List < T > {
590
+ fn repeat ( len : usize , value : T ) -> Self {
591
+ if len == 0 {
592
+ Self :: head ( value)
593
+ } else {
594
+ Self :: cons ( value. clone ( ) , Self :: repeat ( len - 1 , value) )
585
595
}
586
596
}
597
+ }
587
598
599
+ impl List < usize > {
588
600
fn integers ( len : usize ) -> Self {
589
601
if len == 0 {
590
- Self :: empty ( )
602
+ Self :: head ( 0 )
591
603
} else {
592
- Self :: cons ( len - 1 , Self :: integers ( len - 1 ) )
604
+ Self :: cons ( len, Self :: integers ( len - 1 ) )
593
605
}
594
606
}
595
607
}
@@ -601,31 +613,30 @@ fn test_recursion_limit() {
601
613
assert_eq ! (
602
614
b1,
603
615
vec![
604
- 1 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 ,
605
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
616
+ 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 ,
617
+ 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
606
618
]
607
619
) ;
608
- assert_eq ! ( from_bytes:: <List >( & b1) . unwrap( ) , l1) ;
620
+ assert_eq ! ( from_bytes:: <List <_> >( & b1) . unwrap( ) , l1) ;
609
621
610
622
let l2 = List :: integers ( MAX_CONTAINER_DEPTH - 1 ) ;
611
623
let b2 = to_bytes ( & l2) . unwrap ( ) ;
612
- assert_eq ! ( from_bytes:: <List >( & b2) . unwrap( ) , l2) ;
613
-
624
+ assert_eq ! ( from_bytes:: <List <_>>( & b2) . unwrap( ) , l2) ;
614
625
let l3 = List :: integers ( MAX_CONTAINER_DEPTH ) ;
615
626
assert_eq ! (
616
627
to_bytes( & l3) ,
617
628
Err ( Error :: ExceededContainerDepthLimit ( "List" ) )
618
629
) ;
619
- let mut b3 = vec ! [ 1 , 243 , 1 , 0 , 0 , 0 , 0 , 0 , 0 ] ;
630
+ let mut b3 = vec ! [ 244 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ] ;
620
631
b3. extend ( b2) ;
621
632
assert_eq ! (
622
- from_bytes:: <List >( & b3) ,
633
+ from_bytes:: <List < usize > >( & b3) ,
623
634
Err ( Error :: ExceededContainerDepthLimit ( "List" ) )
624
635
) ;
625
636
626
637
let b2_pair = to_bytes ( & ( & l2, & l2) ) . unwrap ( ) ;
627
638
assert_eq ! (
628
- from_bytes:: <( List , List ) >( & b2_pair) . unwrap( ) ,
639
+ from_bytes:: <( List <_> , List <_> ) >( & b2_pair) . unwrap( ) ,
629
640
( l2. clone( ) , l2. clone( ) )
630
641
) ;
631
642
assert_eq ! (
@@ -641,3 +652,31 @@ fn test_recursion_limit() {
641
652
Err ( Error :: ExceededContainerDepthLimit ( "List" ) )
642
653
) ;
643
654
}
655
+ #[ derive( Deserialize , Serialize , Clone , PartialEq , Eq , Debug ) ]
656
+ enum EnumA {
657
+ ValueA ,
658
+ }
659
+
660
+ #[ test]
661
+ fn test_recursion_limit_enum ( ) {
662
+ let l1 = List :: repeat ( 6 , EnumA :: ValueA ) ;
663
+ let b1 = to_bytes ( & l1) . unwrap ( ) ;
664
+ assert_eq ! ( b1, vec![ 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 ] , ) ;
665
+ assert_eq ! ( from_bytes:: <List <_>>( & b1) . unwrap( ) , l1) ;
666
+
667
+ let l2 = List :: repeat ( MAX_CONTAINER_DEPTH - 2 , EnumA :: ValueA ) ;
668
+ let b2 = to_bytes ( & l2) . unwrap ( ) ;
669
+ assert_eq ! ( from_bytes:: <List <_>>( & b2) . unwrap( ) , l2) ;
670
+
671
+ let l3 = List :: repeat ( MAX_CONTAINER_DEPTH - 1 , EnumA :: ValueA ) ;
672
+ assert_eq ! (
673
+ to_bytes( & l3) ,
674
+ Err ( Error :: ExceededContainerDepthLimit ( "EnumA" ) )
675
+ ) ;
676
+ let mut b3 = vec ! [ 0 , 1 ] ;
677
+ b3. extend ( b2) ;
678
+ assert_eq ! (
679
+ from_bytes:: <List <EnumA >>( & b3) ,
680
+ Err ( Error :: ExceededContainerDepthLimit ( "EnumA" ) )
681
+ ) ;
682
+ }
0 commit comments