use sqlx::{MySql, QueryBuilder, Row};
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct KlineData {
pub t: i64,
pub s: String,
pub o: String,
pub c: String,
pub h: String,
pub l: String,
pub vr: String,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, async_graphql::SimpleObject)]
pub struct KlineDataVo {
pub t: String,
pub s: String,
pub o: String,
pub c: String,
pub h: String,
pub l: String,
pub vr: String,
}
impl From<KlineData> for KlineDataVo {
fn from(item: KlineData) -> Self {
KlineDataVo {
t: crate::commons::to_utc_datetime_string(item.t),
s: item.s,
o: item.o,
c: item.c,
h: item.h,
l: item.l,
vr: item.vr,
}
}
}
#[derive(async_graphql::InputObject, serde::Serialize, serde::Deserialize, validator::Validate)]
pub struct FetchKline {
pub symbol: Option<String>,
#[graphql(validator(minimum = 0))]
pub skip: Option<u32>,
#[graphql(validator(minimum = 0, maximum = 100))]
pub limit: Option<u32>,
pub order_by: Option<String>,
}
impl FetchKline {
pub fn build(&self) -> QueryBuilder<'_, MySql> {
let mut query_builder: QueryBuilder<MySql> = QueryBuilder::new(
r#"
SELECT f_symbol, f_open, f_close, f_high, f_low, f_time, f_vendor from t_kline where 1=1
"#,
);
if let Some(symbol) = &self.symbol {
query_builder.push(" AND f_symbol = ");
query_builder.push_bind(symbol);
}
if let Some(order_by) = &self.order_by {
use crate::core::mysql::Ordering;
query_builder.push(Ordering::order_by(order_by));
}
if let Some(limit) = self.limit {
query_builder.push(" limit ");
query_builder.push_bind(limit);
} else {
query_builder.push(" limit ");
query_builder.push_bind(10);
}
if let Some(skip) = self.skip {
query_builder.push(" offset ");
query_builder.push_bind(skip);
}
query_builder
}
pub fn from_row(r: sqlx::mysql::MySqlRow) -> Result<KlineDataVo, anyhow::Error> {
#[rustfmt::skip]
let r1: sqlx::types::BigDecimal = r.try_get(1).map_err(|e| anyhow::anyhow!(e))?;
let r2: sqlx::types::BigDecimal = r.try_get(2).map_err(|e| anyhow::anyhow!(e))?;
let r3: sqlx::types::BigDecimal = r.try_get(3).map_err(|e| anyhow::anyhow!(e))?;
let r4: sqlx::types::BigDecimal = r.try_get(4).map_err(|e| anyhow::anyhow!(e))?;
let r5: u64 = r.try_get(5).map_err(|e| anyhow::anyhow!(e))?;
Ok(KlineDataVo {
s: r.get(0),
o: crate::commons::remove_trailing_zeros(&r1.to_string()),
c: crate::commons::remove_trailing_zeros(&r2.to_string()),
h: crate::commons::remove_trailing_zeros(&r3.to_string()),
l: crate::commons::remove_trailing_zeros(&r4.to_string()),
t: crate::commons::to_utc_datetime_string(r5 as i64),
vr: r.get(6),
})
}
}