use chrono::NaiveDate;
use serde::{Deserialize, Deserializer};
pub mod bond;
pub mod derivative;
pub mod esg;
pub mod etp;
pub mod general;
pub mod index;
pub mod stock;
#[derive(Debug, Deserialize)]
pub struct ApiResponse<T> {
#[serde(rename = "OutBlock_1")]
pub data: Vec<T>,
}
pub fn deserialize_krx_date<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
NaiveDate::parse_from_str(&s, "%Y%m%d").map_err(serde::de::Error::custom)
}
pub fn deserialize_optional_krx_date<'de, D>(deserializer: D) -> Result<Option<NaiveDate>, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
if s.is_empty() || s == "-" {
Ok(None)
} else {
NaiveDate::parse_from_str(&s, "%Y%m%d")
.map(Some)
.map_err(serde::de::Error::custom)
}
}
pub fn deserialize_optional_f64<'de, D>(deserializer: D) -> Result<Option<f64>, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
if s.is_empty() || s == "-" {
Ok(None)
} else {
s.replace(',', "")
.parse::<f64>()
.map(Some)
.map_err(serde::de::Error::custom)
}
}
pub fn deserialize_optional_u64<'de, D>(deserializer: D) -> Result<Option<u64>, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
if s.is_empty() || s == "-" {
Ok(None)
} else {
s.replace(',', "")
.parse::<u64>()
.map(Some)
.map_err(serde::de::Error::custom)
}
}
pub fn deserialize_optional_percentage<'de, D>(deserializer: D) -> Result<Option<f64>, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
if s.is_empty() || s == "-" {
Ok(None)
} else {
s.parse::<f64>().map(Some).map_err(serde::de::Error::custom)
}
}
pub fn deserialize_f64<'de, D>(deserializer: D) -> Result<f64, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
s.replace(',', "")
.parse::<f64>()
.map_err(serde::de::Error::custom)
}
pub fn deserialize_u64<'de, D>(deserializer: D) -> Result<u64, D::Error>
where
D: Deserializer<'de>,
{
let s: String = Deserialize::deserialize(deserializer)?;
s.replace(',', "")
.parse::<u64>()
.map_err(serde::de::Error::custom)
}