use std::range::Range;
use databento::{
HistoricalClient,
dbn::{Dataset, Schema, decode::AsyncDbnDecoder},
historical::timeseries::GetRangeParams,
};
use time::{UtcDateTime, UtcOffset};
use tokio::io::AsyncReadExt;
use crate::{backends::databento::symbology::Symbology, instrument::InstrumentTicker};
pub(crate) struct DatabentoHistorical {
historical_client: HistoricalClient,
}
impl DatabentoHistorical {
pub(crate) fn new(api_key: &str) -> Self {
let historical_client = HistoricalClient::builder()
.key(api_key)
.unwrap()
.build()
.unwrap();
Self { historical_client }
}
pub(crate) async fn available_end(&mut self) -> Result<UtcDateTime, databento::Error> {
let dataset_range = self
.historical_client
.metadata()
.get_dataset_range(Dataset::GlbxMdp3)
.await?;
Ok(dataset_range.start.to_utc())
}
pub(crate) async fn stream(
&mut self,
instrument_ticker: &InstrumentTicker,
utc_date_time_range: Range<UtcDateTime>,
) -> Result<AsyncDbnDecoder<impl AsyncReadExt>, databento::Error> {
let (symbol, stype) = instrument_ticker.symbol();
let get_range_params = GetRangeParams::builder()
.dataset(Dataset::GlbxMdp3)
.symbols([symbol.as_str()])
.schema(Schema::Trades)
.stype_in(stype)
.date_time_range((
utc_date_time_range
.start
.to_offset(UtcOffset::UTC),
utc_date_time_range
.end
.to_offset(UtcOffset::UTC),
))
.build();
self.historical_client
.timeseries()
.get_range(&get_range_params)
.await
}
}