use crate::{
api::common::{latest_workday_string, validate_base_date},
client::Client,
data::{ApiResponse, index::*},
error::Result,
};
use polars::prelude::DataFrame;
pub struct IndexApi<'a> {
pub(crate) client: &'a Client,
}
impl<'a> IndexApi<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn krx_daily(&self) -> KrxIndexDailyBuilder<'a> {
KrxIndexDailyBuilder::new(self.client)
}
pub fn kospi_daily(&self) -> KospiIndexDailyBuilder<'a> {
KospiIndexDailyBuilder::new(self.client)
}
pub fn kosdaq_daily(&self) -> KosdaqIndexDailyBuilder<'a> {
KosdaqIndexDailyBuilder::new(self.client)
}
pub fn bond_daily(&self) -> BondIndexDailyBuilder<'a> {
BondIndexDailyBuilder::new(self.client)
}
pub fn derivative_daily(&self) -> DerivativeIndexDailyBuilder<'a> {
DerivativeIndexDailyBuilder::new(self.client)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KrxIndexDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KrxIndexDailyBuilder<'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<KrxIndexDailyRecord>>("/idx/krx_dd_trd", &[("basDd", &base_date)])
.await?;
parse_krx_index_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KospiIndexDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KospiIndexDailyBuilder<'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<KospiIndexDailyRecord>>(
"/idx/kospi_dd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_kospi_index_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KosdaqIndexDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KosdaqIndexDailyBuilder<'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<KosdaqIndexDailyRecord>>(
"/idx/kosdaq_dd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_kosdaq_index_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct BondIndexDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> BondIndexDailyBuilder<'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<BondIndexDailyRecord>>("/idx/bon_dd_trd", &[("basDd", &base_date)])
.await?;
parse_bond_index_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct DerivativeIndexDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> DerivativeIndexDailyBuilder<'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<DerivativeIndexDailyRecord>>(
"/idx/drvprod_dd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_derivative_index_daily(response)
}
}