use crate::{
api::common::{latest_workday_string, validate_base_date},
client::Client,
data::{ApiResponse, derivative::*},
error::Result,
};
use polars::prelude::DataFrame;
pub struct DerivativeApi<'a> {
pub(crate) client: &'a Client,
}
impl<'a> DerivativeApi<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn futures_daily(&self) -> FuturesDailyBuilder<'a> {
FuturesDailyBuilder::new(self.client)
}
pub fn equity_stock_futures_daily(&self) -> EquityStockFuturesDailyBuilder<'a> {
EquityStockFuturesDailyBuilder::new(self.client)
}
pub fn equity_kosdaq_futures_daily(&self) -> EquityKosdaqFuturesDailyBuilder<'a> {
EquityKosdaqFuturesDailyBuilder::new(self.client)
}
pub fn options_daily(&self) -> OptionsDailyBuilder<'a> {
OptionsDailyBuilder::new(self.client)
}
pub fn equity_stock_options_daily(&self) -> EquityStockOptionsDailyBuilder<'a> {
EquityStockOptionsDailyBuilder::new(self.client)
}
pub fn equity_kosdaq_options_daily(&self) -> EquityKosdaqOptionsDailyBuilder<'a> {
EquityKosdaqOptionsDailyBuilder::new(self.client)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct FuturesDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> FuturesDailyBuilder<'a> {
fn new(client: &'a Client) -> Self {
Self {
client,
base_date: None,
}
}
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some(latest_workday_string());
self
}
pub async fn fetch(self) -> Result<DataFrame> {
let base_date = validate_base_date(self.base_date)?;
let response = self
.client
.get::<ApiResponse<FuturesDailyRecord>>("/drv/fut_bydd_trd", &[("basDd", &base_date)])
.await?;
parse_futures_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct EquityStockFuturesDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> EquityStockFuturesDailyBuilder<'a> {
fn new(client: &'a Client) -> Self {
Self {
client,
base_date: None,
}
}
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some(latest_workday_string());
self
}
pub async fn fetch(self) -> Result<DataFrame> {
let base_date = validate_base_date(self.base_date)?;
let response = self
.client
.get::<ApiResponse<EquityStockFuturesDailyRecord>>(
"/drv/eqsfu_stk_bydd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_equity_stock_futures_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct EquityKosdaqFuturesDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> EquityKosdaqFuturesDailyBuilder<'a> {
fn new(client: &'a Client) -> Self {
Self {
client,
base_date: None,
}
}
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some(latest_workday_string());
self
}
pub async fn fetch(self) -> Result<DataFrame> {
let base_date = validate_base_date(self.base_date)?;
let response = self
.client
.get::<ApiResponse<EquityKosdaqFuturesDailyRecord>>(
"/drv/eqkfu_ksq_bydd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_equity_kosdaq_futures_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct OptionsDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> OptionsDailyBuilder<'a> {
fn new(client: &'a Client) -> Self {
Self {
client,
base_date: None,
}
}
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some(latest_workday_string());
self
}
pub async fn fetch(self) -> Result<DataFrame> {
let base_date = validate_base_date(self.base_date)?;
let response = self
.client
.get::<ApiResponse<OptionsDailyRecord>>("/drv/opt_bydd_trd", &[("basDd", &base_date)])
.await?;
parse_options_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct EquityStockOptionsDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> EquityStockOptionsDailyBuilder<'a> {
fn new(client: &'a Client) -> Self {
Self {
client,
base_date: None,
}
}
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some(latest_workday_string());
self
}
pub async fn fetch(self) -> Result<DataFrame> {
let base_date = validate_base_date(self.base_date)?;
let response = self
.client
.get::<ApiResponse<EquityStockOptionsDailyRecord>>(
"/drv/eqsop_bydd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_equity_stock_options_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct EquityKosdaqOptionsDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> EquityKosdaqOptionsDailyBuilder<'a> {
fn new(client: &'a Client) -> Self {
Self {
client,
base_date: None,
}
}
pub fn date(mut self, date: impl Into<String>) -> Self {
self.base_date = Some(date.into());
self
}
pub fn latest(mut self) -> Self {
self.base_date = Some(latest_workday_string());
self
}
pub async fn fetch(self) -> Result<DataFrame> {
let base_date = validate_base_date(self.base_date)?;
let response = self
.client
.get::<ApiResponse<EquityKosdaqOptionsDailyRecord>>(
"/drv/eqkop_bydd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_equity_kosdaq_options_daily(response)
}
}