use serde::{Deserialize, Deserializer, Serialize};
use serde_json::Value;
fn deserialize_nullable_string<'de, D>(deserializer: D) -> Result<String, D::Error>
where
D: Deserializer<'de>,
{
let opt: Option<String> = Option::deserialize(deserializer)?;
Ok(opt.unwrap_or_default())
}
#[derive(Debug, Clone, Deserialize)]
pub struct ApiResponse {
pub code: i32,
#[serde(alias = "message", default)]
pub msg: String,
#[serde(default)]
pub data: Value,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TokenResponse {
pub token_type: String,
#[serde(rename = "token")]
pub access_token: String,
pub expires_in: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Article {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub id: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub title: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub sub_title: String,
#[serde(
rename = "infoSummary",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub summary: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub show_date: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub create_date: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub content: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub keywords: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub page_name: String,
}
pub type ArticleDetail = Article;
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetArticleByPageRequest {
pub column_id: String,
pub page_no: i32,
pub page_size: i32,
pub site_id: i32,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GetArticleByPageResponse {
pub column_id: String,
pub total_count: i32,
pub result_list: Vec<Article>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TradeDate {
#[serde(
rename = "tradeDate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub date: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Variety {
#[serde(
rename = "varietyId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub code: String,
#[serde(
rename = "varietyName",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub name: String,
#[serde(
rename = "varietyEnglishName",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub english_name: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub pic: String,
#[serde(
rename = "varietyType",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub variety_type: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Quote {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety: String,
#[serde(
rename = "contractId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub contract_id: String,
#[serde(
rename = "delivMonth",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub deliv_month: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub open: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub high: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub low: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub close: String,
#[serde(
rename = "lastClear",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub last_clear: String,
#[serde(
rename = "lastPrice",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub last_price: String,
#[serde(
rename = "clearPrice",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub clear_price: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub diff: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub diff1: String,
#[serde(rename = "volumn", default)]
pub volume: i64,
#[serde(rename = "openInterest", default)]
pub open_interest: i64,
#[serde(rename = "diffI", default)]
pub diff_i: i64,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub turnover: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct QuotesRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub variety_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variety: Option<String>,
pub trade_date: String,
pub trade_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub lang: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub statistics_type: Option<i32>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WeekQuotesRequest {
pub variety_code: String,
pub year: i32,
pub week: i32,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MonthQuotesRequest {
pub variety_code: String,
pub year: i32,
pub month: i32,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ContractStatRequest {
pub contract_code: String,
pub start_date: String,
pub end_date: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContractStat {
pub contract_code: String,
pub total_volume: i64,
pub avg_price: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryData {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety_code: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub delivery_month: String,
pub delivery_volume: i64,
pub delivery_amount: f64,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryDataRequest {
pub variety_code: String,
pub trade_date: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryMatch {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety_code: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub buy_member: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub sell_member: String,
pub volume: i64,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryMatchRequest {
pub variety_code: String,
pub trade_date: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WarehouseReceipt {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety_code: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub warehouse_name: String,
pub quantity: i64,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub trade_date: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WarehouseReceiptRequest {
pub variety_code: String,
pub trade_date: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeliveryCost {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety_code: String,
pub delivery_fee: f64,
pub inspection_fee: f64,
pub storage_fee: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WarehousePremium {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety_code: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub warehouse_name: String,
pub premium: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Ranking {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub rank: String,
#[serde(
rename = "qtyAbbr",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub qty_abbr: String,
#[serde(rename = "todayQty", default)]
pub today_qty: i64,
#[serde(rename = "qtySub", default)]
pub qty_sub: i64,
#[serde(
rename = "buyAbbr",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub buy_abbr: String,
#[serde(rename = "todayBuyQty", default)]
pub today_buy_qty: i64,
#[serde(rename = "buySub", default)]
pub buy_sub: i64,
#[serde(
rename = "sellAbbr",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub sell_abbr: String,
#[serde(rename = "todaySellQty", default)]
pub today_sell_qty: i64,
#[serde(rename = "sellSub", default)]
pub sell_sub: i64,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DailyRankingRequest {
pub variety_id: String,
pub contract_id: String,
pub trade_date: String,
pub trade_type: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DailyRankingResponse {
#[serde(
rename = "contractId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub contract_id: String,
#[serde(rename = "todayQty", default)]
pub today_qty: i64,
#[serde(rename = "qtySub", default)]
pub qty_sub: i64,
#[serde(rename = "todayBuyQty", default)]
pub today_buy_qty: i64,
#[serde(rename = "buySub", default)]
pub buy_sub: i64,
#[serde(rename = "todaySellQty", default)]
pub today_sell_qty: i64,
#[serde(rename = "sellSub", default)]
pub sell_sub: i64,
#[serde(rename = "qtyFutureList", default)]
pub qty_future_list: Vec<Ranking>,
#[serde(rename = "buyFutureList", default)]
pub buy_future_list: Vec<Ranking>,
#[serde(rename = "sellFutureList", default)]
pub sell_future_list: Vec<Ranking>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PhaseRankingRequest {
pub variety: String,
pub start_month: String,
pub end_month: String,
pub trade_type: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PhaseRanking {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub seq: String,
#[serde(
rename = "memberId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub member_id: String,
#[serde(
rename = "memberName",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub member_name: String,
#[serde(rename = "monthQty", default)]
pub month_qty: f64,
#[serde(rename = "qtyRatio", default)]
pub qty_ratio: f64,
#[serde(rename = "monthAmt", default)]
pub month_amt: f64,
#[serde(rename = "amtRatio", default)]
pub amt_ratio: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TradeParam {
#[serde(
rename = "contractId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub contract_id: String,
#[serde(rename = "specBuyRate", default)]
pub spec_buy_rate: f64,
#[serde(rename = "specBuy", default)]
pub spec_buy: f64,
#[serde(rename = "hedgeBuyRate", default)]
pub hedge_buy_rate: f64,
#[serde(rename = "hedgeBuy", default)]
pub hedge_buy: f64,
#[serde(rename = "riseLimitRate", default)]
pub rise_limit_rate: f64,
#[serde(rename = "riseLimit", default)]
pub rise_limit: f64,
#[serde(rename = "fallLimit", default)]
pub fall_limit: f64,
#[serde(
rename = "tradeDate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub trade_date: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DayTradeParamRequest {
pub variety_id: String,
pub trade_type: String,
pub lang: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContractInfo {
#[serde(
rename = "contractId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub contract_id: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety: String,
#[serde(
rename = "varietyOrder",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub variety_order: String,
#[serde(default)]
pub unit: i32,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub tick: String,
#[serde(
rename = "startTradeDate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub start_trade_date: String,
#[serde(
rename = "endTradeDate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub end_trade_date: String,
#[serde(
rename = "endDeliveryDate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub end_delivery_date: String,
#[serde(
rename = "tradeType",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub trade_type: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ContractInfoRequest {
pub variety_id: String,
pub trade_type: String,
pub lang: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ArbitrageContract {
#[serde(
rename = "arbiName",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub arbi_name: String,
#[serde(
rename = "varietyName",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub variety_name: String,
#[serde(
rename = "arbiContractId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub arbi_contract_id: String,
#[serde(rename = "maxHand", default)]
pub max_hand: i32,
#[serde(default)]
pub tick: f64,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ArbitrageContractRequest {
pub lang: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SettleParam {
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub variety: String,
#[serde(
rename = "varietyOrder",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub variety_order: String,
#[serde(
rename = "contractId",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub contract_id: String,
#[serde(
rename = "clearPrice",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub clear_price: String,
#[serde(
rename = "openFee",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub open_fee: String,
#[serde(
rename = "offsetFee",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub offset_fee: String,
#[serde(
rename = "shortOpenFee",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub short_open_fee: String,
#[serde(
rename = "shortOffsetFee",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub short_offset_fee: String,
#[serde(default, deserialize_with = "deserialize_nullable_string")]
pub style: String,
#[serde(
rename = "specBuyRate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub spec_buy_rate: String,
#[serde(
rename = "specSellRate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub spec_sell_rate: String,
#[serde(
rename = "hedgeBuyRate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub hedge_buy_rate: String,
#[serde(
rename = "hedgeSellRate",
default,
deserialize_with = "deserialize_nullable_string"
)]
pub hedge_sell_rate: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SettleParamRequest {
pub variety_id: String,
pub trade_date: String,
pub trade_type: String,
pub lang: String,
}