use tokio::{fs::File, io::BufReader};
use crate::{
backend::{OrdersBackendUpdate, OrdersBackendUpdateRecycle},
instrument::InstrumentSpec, order_manager::OrdersCapacitySpec, strategy::Strategy,
timestamp::TimestampRangeExclusive, Frontend,
};
use super::{HistoricalDataBackend, MarketDataDecoderProvider, OrdersBackend};
pub trait DataBackend<
'instrument_data,
'aggregated_data,
IS: InstrumentSpec,
OB: OrdersBackend<IS>,
OrdersCS: OrdersCapacitySpec,
S: Strategy<IS, OB, OrdersCS>,
>: MarketDataDecoderProvider<IS> {
fn new(
data_key: Option<&str>,
frontend: Frontend<'instrument_data, 'aggregated_data, IS, OB, OrdersCS, S>,
orders_backend_update_receiver: thingbuf::mpsc::Receiver<
OrdersBackendUpdate<IS>,
OrdersBackendUpdateRecycle,
>,
) -> Self;
fn file_name_postpend() -> &'static str;
fn backtest(
&mut self,
walk_range: TimestampRangeExclusive,
) -> impl Future<Output = ()>;
fn decode_market_data(
buf_readers: impl ExactSizeIterator<Item = BufReader<File>>,
) -> impl Future<Output = Self::MarketDataDecoder>;
fn historical_mut(
&mut self,
) -> Option<Result<&mut impl HistoricalDataBackend<IS>, ()>>;
}