@@ -48,10 +48,39 @@ pub enum ProviderNetworkStatus {
4848 } ,
4949}
5050
51+ pub trait ChainFilter : Send + Sync {
52+ fn filter ( & self , chain_name : & str ) -> bool ;
53+ }
54+
55+ pub struct AnyChainFilter ;
56+
57+ impl ChainFilter for AnyChainFilter {
58+ fn filter ( & self , _: & str ) -> bool {
59+ true
60+ }
61+ }
62+
63+ pub struct OneChainFilter {
64+ chain_name : String ,
65+ }
66+
67+ impl OneChainFilter {
68+ pub fn new ( chain_name : String ) -> Self {
69+ Self { chain_name }
70+ }
71+ }
72+
73+ impl ChainFilter for OneChainFilter {
74+ fn filter ( & self , chain_name : & str ) -> bool {
75+ self . chain_name == chain_name
76+ }
77+ }
78+
5179pub fn create_substreams_networks (
5280 logger : Logger ,
5381 config : & Config ,
5482 endpoint_metrics : Arc < EndpointMetrics > ,
83+ chain_filter : & dyn ChainFilter ,
5584) -> Vec < AdapterConfiguration > {
5685 debug ! (
5786 logger,
@@ -63,7 +92,13 @@ pub fn create_substreams_networks(
6392 let mut networks_by_kind: BTreeMap < ( BlockchainKind , ChainName ) , Vec < Arc < FirehoseEndpoint > > > =
6493 BTreeMap :: new ( ) ;
6594
66- for ( name, chain) in & config. chains . chains {
95+ let filtered_chains = config
96+ . chains
97+ . chains
98+ . iter ( )
99+ . filter ( |( name, _) | chain_filter. filter ( name) ) ;
100+
101+ for ( name, chain) in filtered_chains {
67102 let name: ChainName = name. as_str ( ) . into ( ) ;
68103 for provider in & chain. providers {
69104 if let ProviderDetails :: Substreams ( ref firehose) = provider. details {
@@ -113,6 +148,7 @@ pub fn create_firehose_networks(
113148 logger : Logger ,
114149 config : & Config ,
115150 endpoint_metrics : Arc < EndpointMetrics > ,
151+ chain_filter : & dyn ChainFilter ,
116152) -> Vec < AdapterConfiguration > {
117153 debug ! (
118154 logger,
@@ -124,7 +160,13 @@ pub fn create_firehose_networks(
124160 let mut networks_by_kind: BTreeMap < ( BlockchainKind , ChainName ) , Vec < Arc < FirehoseEndpoint > > > =
125161 BTreeMap :: new ( ) ;
126162
127- for ( name, chain) in & config. chains . chains {
163+ let filtered_chains = config
164+ . chains
165+ . chains
166+ . iter ( )
167+ . filter ( |( name, _) | chain_filter. filter ( name) ) ;
168+
169+ for ( name, chain) in filtered_chains {
128170 let name: ChainName = name. as_str ( ) . into ( ) ;
129171 for provider in & chain. providers {
130172 let logger = logger. cheap_clone ( ) ;
@@ -179,18 +221,20 @@ pub fn create_firehose_networks(
179221
180222/// Parses all Ethereum connection strings and returns their network names and
181223/// `EthereumAdapter`.
182- pub async fn create_all_ethereum_networks (
224+ pub async fn create_ethereum_networks (
183225 logger : Logger ,
184226 registry : Arc < MetricsRegistry > ,
185227 config : & Config ,
186228 endpoint_metrics : Arc < EndpointMetrics > ,
229+ chain_filter : & dyn ChainFilter ,
187230) -> anyhow:: Result < Vec < AdapterConfiguration > > {
188231 let eth_rpc_metrics = Arc :: new ( ProviderEthRpcMetrics :: new ( registry) ) ;
189232 let eth_networks_futures = config
190233 . chains
191234 . chains
192235 . iter ( )
193236 . filter ( |( _, chain) | chain. protocol == BlockchainKind :: Ethereum )
237+ . filter ( |( name, _) | chain_filter. filter ( name) )
194238 . map ( |( name, _) | {
195239 create_ethereum_networks_for_chain (
196240 & logger,
0 commit comments