use core::time::Duration; use log::{error, info}; use tokio::time::sleep; use crate::BoxError; use crate::connectors::ExchangeDetails; use crate::currency::{Symbol, SymbolPair}; use crate::frontend::FrontendManagerHandle; use crate::managers::ExchangeManager; use crate::ticker::Ticker; pub struct Rustico { ticker: Ticker, exchange_managers: Vec, frontend_connector: FrontendManagerHandle, } impl Rustico { // TODO: change constructor to take SymbolPairs and not Symbol pub fn new( exchanges: Vec, trading_pairs: Vec, tick_duration: Duration, ) -> Self { let exchange_managers = exchanges .iter() .map(|x| ExchangeManager::new(x, &trading_pairs)) .collect(); Rustico { ticker: Ticker::new(tick_duration), exchange_managers, frontend_connector: FrontendManagerHandle::new(), } } pub async fn start_loop(&mut self) -> Result<(), BoxError> { self.update_exchanges().await?; loop { info!("Current tick: {}", self.ticker.current_tick()); if let Err(e) = self.update().await { error!("Error in main bot loop: {}", e); } } } async fn update_exchanges(&mut self) -> Result<(), BoxError> { for e in &mut self.exchange_managers { if let Err(err) = e.update_managers(self.ticker.current_tick()).await { error!("Error while updating managers: {}", err); } } Ok(()) } async fn update(&mut self) -> Result<(), BoxError> { sleep(self.ticker.duration()).await; self.ticker.inc(); self.update_exchanges().await?; Ok(()) } }