use std::range::Range;
use databento::{
dbn::{decode::AsyncDbnDecoder, Dataset, Schema},
historical::timeseries::GetRangeParams, HistoricalClient,
};
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
}
}