use crate::pools::pool_fetchers::{UniswapV3Fetcher, MerchantMoeV2Fetcher, AgniV3Fetcher};
use crate::errors::*;
use crate::pools::*;
use crate::{Chain, PoolSync, PoolType};
use std::collections::HashMap;
use std::sync::Arc;
#[derive(Default)]
pub struct PoolSyncBuilder {
fetchers: HashMap<PoolType, Arc<dyn PoolFetcher>>,
chain: Option<Chain>,
rate_limit: Option<usize>,
start_block: Option<u64>,
end_block: Option<u64>,
}
impl PoolSyncBuilder {
pub fn add_pool(mut self, pool_type: PoolType) -> Self {
match pool_type {
PoolType::UniswapV3 => {
self.fetchers
.insert(PoolType::UniswapV3, Arc::new(UniswapV3Fetcher));
}
PoolType::MerchantMoe => {
self.fetchers
.insert(PoolType::MerchantMoe, Arc::new(MerchantMoeV2Fetcher));
}
PoolType::Agni => {
self.fetchers
.insert(PoolType::Agni, Arc::new(AgniV3Fetcher));
}
}
self
}
pub fn add_pools(mut self, pools: &[PoolType]) -> Self {
for pool in pools.iter() {
self = self.add_pool(*pool);
}
self
}
pub fn chain(mut self, chain: Chain) -> Self {
self.chain = Some(chain);
self
}
pub fn rate_limit(mut self, rate_limit: usize) -> Self {
self.rate_limit = Some(rate_limit);
self
}
pub fn start_block(mut self, start_block: u64) -> Self {
self.start_block = Some(start_block);
self
}
pub fn end_block(mut self, end_block: u64) -> Self {
self.end_block = Some(end_block);
self
}
pub fn block_range(mut self, start_block: u64, end_block: u64) -> Self {
self.start_block = Some(start_block);
self.end_block = Some(end_block);
self
}
pub fn build(self) -> Result<PoolSync, PoolSyncError> {
let chain = self.chain.ok_or(PoolSyncError::ChainNotSet)?;
for pool_type in self.fetchers.keys() {
if !chain.supported(pool_type) {
return Err(PoolSyncError::UnsupportedPoolType);
}
}
let rate_limit = self.rate_limit.unwrap_or(10000) as u64;
Ok(PoolSync {
fetchers: self.fetchers,
rate_limit,
chain,
start_block: self.start_block,
end_block: self.end_block,
})
}
}