use crate::{
api::common::{latest_workday_string, validate_base_date},
client::Client,
data::{ApiResponse, stock::*},
error::Result,
};
use polars::prelude::DataFrame;
pub struct StockApi<'a> {
pub(crate) client: &'a Client,
}
impl<'a> StockApi<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn kospi_daily(&self) -> KospiDailyBuilder<'a> {
KospiDailyBuilder::new(self.client)
}
pub fn kosdaq_daily(&self) -> KosdaqDailyBuilder<'a> {
KosdaqDailyBuilder::new(self.client)
}
pub fn konex_daily(&self) -> KonexDailyBuilder<'a> {
KonexDailyBuilder::new(self.client)
}
pub fn stock_warrant_daily(&self) -> StockWarrantDailyBuilder<'a> {
StockWarrantDailyBuilder::new(self.client)
}
pub fn stock_right_daily(&self) -> StockRightDailyBuilder<'a> {
StockRightDailyBuilder::new(self.client)
}
pub fn kospi_base_info(&self) -> KospiBaseInfoBuilder<'a> {
KospiBaseInfoBuilder::new(self.client)
}
pub fn kosdaq_base_info(&self) -> KosdaqBaseInfoBuilder<'a> {
KosdaqBaseInfoBuilder::new(self.client)
}
pub fn konex_base_info(&self) -> KonexBaseInfoBuilder<'a> {
KonexBaseInfoBuilder::new(self.client)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KospiDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KospiDailyBuilder<'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<KospiDailyRecord>>("/sto/stk_bydd_trd", &[("basDd", &base_date)])
.await?;
parse_kospi_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KosdaqDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KosdaqDailyBuilder<'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<KosdaqDailyRecord>>("/sto/ksq_bydd_trd", &[("basDd", &base_date)])
.await?;
parse_kosdaq_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KonexDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KonexDailyBuilder<'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<KonexDailyRecord>>("/sto/knx_bydd_trd", &[("basDd", &base_date)])
.await?;
parse_konex_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct StockWarrantDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> StockWarrantDailyBuilder<'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<StockWarrantDailyRecord>>(
"/sto/sw_bydd_trd",
&[("basDd", &base_date)],
)
.await?;
parse_stock_warrant_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct StockRightDailyBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> StockRightDailyBuilder<'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<StockRightDailyRecord>>("/sto/sr_bydd_trd", &[("basDd", &base_date)])
.await?;
parse_stock_right_daily(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KospiBaseInfoBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KospiBaseInfoBuilder<'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<crate::data::stock::StockBaseInfoRecord>>(
"/sto/stk_isu_base_info",
&[("basDd", &base_date)],
)
.await?;
parse_stock_base_info(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KosdaqBaseInfoBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KosdaqBaseInfoBuilder<'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<crate::data::stock::StockBaseInfoRecord>>(
"/sto/ksq_isu_base_info",
&[("basDd", &base_date)],
)
.await?;
parse_stock_base_info(response)
}
}
#[must_use = "Builder does nothing unless you call .fetch()"]
pub struct KonexBaseInfoBuilder<'a> {
client: &'a Client,
base_date: Option<String>,
}
impl<'a> KonexBaseInfoBuilder<'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<crate::data::stock::StockBaseInfoRecord>>(
"/sto/knx_isu_base_info",
&[("basDd", &base_date)],
)
.await?;
parse_stock_base_info(response)
}
}