@@ -33,6 +33,16 @@ pub struct ProviderManager<T: NetworkDetails> {
3333 validation_retry_interval : Duration ,
3434}
3535
36+ /// The strategy used by the [ProviderManager] when checking providers.
37+ #[ derive( Clone ) ]
38+ pub enum ProviderCheckStrategy < ' a > {
39+ /// Marks a provider as valid without performing any checks on it.
40+ MarkAsValid ,
41+
42+ /// Requires a provider to pass all specified checks to be considered valid.
43+ RequireAll ( & ' a [ Arc < dyn ProviderCheck > ] ) ,
44+ }
45+
3646#[ derive( Debug , Error ) ]
3747pub enum ProviderManagerError {
3848 #[ error( "provider validation timed out on chain '{0}'" ) ]
@@ -90,8 +100,13 @@ impl<T: NetworkDetails> ProviderManager<T> {
90100 pub fn new (
91101 logger : Logger ,
92102 adapters : impl IntoIterator < Item = ( ChainName , Vec < T > ) > ,
93- enabled_checks : & [ Arc < dyn ProviderCheck > ] ,
103+ strategy : ProviderCheckStrategy < ' _ > ,
94104 ) -> Self {
105+ let enabled_checks = match strategy {
106+ ProviderCheckStrategy :: MarkAsValid => & [ ] ,
107+ ProviderCheckStrategy :: RequireAll ( checks) => checks,
108+ } ;
109+
95110 let mut validations: Vec < Validation > = Vec :: new ( ) ;
96111 let adapters = Self :: adapters_by_chain_names ( adapters, & mut validations, & enabled_checks) ;
97112
@@ -459,7 +474,8 @@ mod tests {
459474
460475 #[ tokio:: test]
461476 async fn no_providers ( ) {
462- let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new ( discard ( ) , [ ] , & [ ] ) ;
477+ let manager: ProviderManager < Arc < TestAdapter > > =
478+ ProviderManager :: new ( discard ( ) , [ ] , ProviderCheckStrategy :: MarkAsValid ) ;
463479
464480 assert_eq ! ( manager. len( & chain_name( ) ) , 0 ) ;
465481 assert_eq ! ( manager. providers_unchecked( & chain_name( ) ) . count( ) , 0 ) ;
@@ -474,7 +490,7 @@ mod tests {
474490 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
475491 discard ( ) ,
476492 [ ( other_chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
477- & [ ] ,
493+ ProviderCheckStrategy :: MarkAsValid ,
478494 ) ;
479495
480496 assert_eq ! ( manager. len( & chain_name( ) ) , 0 ) ;
@@ -506,7 +522,7 @@ mod tests {
506522 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
507523 discard ( ) ,
508524 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) , adapter_2. clone( ) ] ) ] ,
509- & [ ] ,
525+ ProviderCheckStrategy :: MarkAsValid ,
510526 ) ;
511527
512528 assert_eq ! ( manager. len( & chain_name( ) ) , 2 ) ;
@@ -529,7 +545,7 @@ mod tests {
529545 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
530546 discard ( ) ,
531547 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
532- & [ check_1. clone ( ) ] ,
548+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
533549 ) ;
534550
535551 assert_eq ! ( ids( manager. providers_unchecked( & chain_name( ) ) ) , vec![ 1 ] ) ;
@@ -546,7 +562,7 @@ mod tests {
546562 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
547563 discard ( ) ,
548564 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
549- & [ check_1. clone ( ) ] ,
565+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
550566 ) ;
551567
552568 assert_eq ! (
@@ -575,7 +591,7 @@ mod tests {
575591 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
576592 discard ( ) ,
577593 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
578- & [ check_1. clone ( ) , check_2. clone ( ) ] ,
594+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) , check_2. clone ( ) ] ) ,
579595 ) ;
580596
581597 assert_eq ! (
@@ -609,7 +625,7 @@ mod tests {
609625 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
610626 discard ( ) ,
611627 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) , adapter_2. clone( ) ] ) ] ,
612- & [ check_1. clone ( ) , check_2. clone ( ) ] ,
628+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) , check_2. clone ( ) ] ) ,
613629 ) ;
614630
615631 assert_eq ! (
@@ -638,7 +654,7 @@ mod tests {
638654 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
639655 discard ( ) ,
640656 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) , adapter_2. clone( ) ] ) ] ,
641- & [ check_1. clone ( ) ] ,
657+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
642658 ) ;
643659
644660 assert_eq ! (
@@ -670,7 +686,7 @@ mod tests {
670686 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
671687 discard ( ) ,
672688 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) , adapter_2. clone( ) ] ) ] ,
673- & [ check_1. clone ( ) , check_2. clone ( ) ] ,
689+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) , check_2. clone ( ) ] ) ,
674690 ) ;
675691
676692 assert_eq ! (
@@ -701,7 +717,7 @@ mod tests {
701717 let mut manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
702718 discard ( ) ,
703719 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
704- & [ check_1. clone ( ) ] ,
720+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
705721 ) ;
706722
707723 manager. validation_max_duration = Duration :: from_millis ( 100 ) ;
@@ -732,7 +748,7 @@ mod tests {
732748 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
733749 discard ( ) ,
734750 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
735- & [ check_1. clone ( ) ] ,
751+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
736752 ) ;
737753
738754 match manager. providers ( & chain_name ( ) ) . await {
@@ -757,7 +773,7 @@ mod tests {
757773 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
758774 discard ( ) ,
759775 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
760- & [ check_1. clone ( ) ] ,
776+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
761777 ) ;
762778
763779 match manager. providers ( & chain_name ( ) ) . await {
@@ -787,7 +803,7 @@ mod tests {
787803 let mut manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
788804 discard ( ) ,
789805 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
790- & [ check_1. clone ( ) ] ,
806+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
791807 ) ;
792808
793809 manager. validation_retry_interval = Duration :: from_millis ( 100 ) ;
@@ -813,7 +829,7 @@ mod tests {
813829 let mut manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
814830 discard ( ) ,
815831 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
816- & [ check_1. clone ( ) ] ,
832+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
817833 ) ;
818834
819835 manager. validation_retry_interval = Duration :: from_millis ( 100 ) ;
@@ -851,7 +867,7 @@ mod tests {
851867 chain_name ( ) ,
852868 vec ! [ adapter_1. clone( ) , adapter_2. clone( ) , adapter_3. clone( ) ] ,
853869 ) ] ,
854- & [ check_1. clone ( ) ] ,
870+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
855871 ) ;
856872
857873 assert_eq ! (
@@ -876,7 +892,7 @@ mod tests {
876892 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
877893 discard ( ) ,
878894 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
879- & [ check_1. clone ( ) , check_2. clone ( ) , check_3. clone ( ) ] ,
895+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) , check_2. clone ( ) , check_3. clone ( ) ] ) ,
880896 ) ;
881897
882898 assert ! ( manager. providers( & chain_name( ) ) . await . is_err( ) ) ;
@@ -893,7 +909,7 @@ mod tests {
893909 let manager: ProviderManager < Arc < TestAdapter > > = ProviderManager :: new (
894910 discard ( ) ,
895911 [ ( chain_name ( ) , vec ! [ adapter_1. clone( ) ] ) ] ,
896- & [ check_1. clone ( ) ] ,
912+ ProviderCheckStrategy :: RequireAll ( & [ check_1. clone ( ) ] ) ,
897913 ) ;
898914
899915 let fut = || {
0 commit comments