use rust_decimal::Decimal;
use serde::{Deserialize, Serialize};
use serde_aux::prelude::deserialize_number_from_string as number;
use crate::{LtOrderStatus, LtOrderType, LtStatus, Timestamp, serde::empty_string_as_none};
#[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct GetLeverageTokenInfoParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub lt_coin: Option<String>,
}
impl GetLeverageTokenInfoParams {
pub fn new() -> Self {
Self { lt_coin: None }
}
pub fn with_lt_coin(mut self, v: impl Into<String>) -> Self {
self.lt_coin = Some(v.into());
self
}
}
impl Default for GetLeverageTokenInfoParams {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct LeverageTokenInfo {
pub lt_coin: String,
pub lt_name: String,
pub max_purchase: Decimal,
pub min_purchase: Decimal,
pub max_purchase_daily: Decimal,
pub max_redeem: Decimal,
pub min_redeem: Decimal,
pub max_redeem_daily: Decimal,
pub purchase_fee_rate: Decimal,
pub redeem_fee_rate: Decimal,
pub lt_status: LtStatus,
pub fund_fee: Decimal,
#[serde(deserialize_with = "number")]
pub fund_fee_time: Timestamp,
pub manage_fee_rate: Decimal,
#[serde(deserialize_with = "number")]
pub manage_fee_time: Timestamp,
pub value: Decimal,
pub net_value: Decimal,
pub total: Decimal,
}
#[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct GetLeverageTokenMarketParams {
pub lt_coin: String,
}
impl GetLeverageTokenMarketParams {
pub fn new(lt_coin: impl Into<String>) -> Self {
let lt_coin: String = lt_coin.into();
Self { lt_coin }
}
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct LeverageTokenMarket {
pub lt_coin: String,
pub nav: Decimal,
#[serde(deserialize_with = "number")]
pub nav_time: Timestamp,
pub circulation: Decimal,
pub basket: Decimal,
pub leverage: Decimal,
}
#[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct PurchaseLeverageTokenRequest {
pub lt_coin: String,
pub lt_amount: Decimal,
#[serde(skip_serializing_if = "Option::is_none")]
pub serial_no: Option<String>,
}
impl PurchaseLeverageTokenRequest {
pub fn new(lt_coin: impl Into<String>, lt_amount: Decimal) -> Self {
let lt_coin: String = lt_coin.into();
Self {
lt_coin,
lt_amount,
serial_no: None,
}
}
pub fn with_serial_no(mut self, v: impl Into<String>) -> Self {
self.serial_no = Some(v.into());
self
}
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct PurchaseLeverageTokenResult {
pub lt_coin: String,
pub lt_order_status: LtOrderStatus,
pub exec_qty: Decimal,
pub exec_amt: Decimal,
pub amount: Decimal,
pub purchase_id: String,
#[serde(default, deserialize_with = "empty_string_as_none")]
pub serial_no: Option<String>,
pub value_coin: String,
}
#[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct RedeemLeverageTokenRequest {
pub lt_coin: String,
pub quantity: Decimal,
#[serde(skip_serializing_if = "Option::is_none")]
pub serial_no: Option<String>,
}
impl RedeemLeverageTokenRequest {
pub fn new(lt_coin: impl Into<String>, quantity: Decimal) -> Self {
let lt_coin: String = lt_coin.into();
Self {
lt_coin,
quantity,
serial_no: None,
}
}
pub fn with_serial_no(mut self, v: impl Into<String>) -> Self {
self.serial_no = Some(v.into());
self
}
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct RedeemLeverageTokenResult {
pub lt_coin: String,
pub lt_order_status: LtOrderStatus,
pub quantity: Decimal,
pub exec_qty: Decimal,
pub exec_amt: Decimal,
pub redeem_id: String,
#[serde(default, deserialize_with = "empty_string_as_none")]
pub serial_no: Option<String>,
pub value_coin: String,
}
#[derive(Clone, Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct GetLeverageTokenOrderRecordsParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub lt_coin: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<Timestamp>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lt_order_type: Option<LtOrderType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub serial_no: Option<String>,
}
impl GetLeverageTokenOrderRecordsParams {
pub fn new() -> Self {
Self {
lt_coin: None,
order_id: None,
start_time: None,
end_time: None,
limit: None,
lt_order_type: None,
serial_no: None,
}
}
pub fn with_lt_coin(mut self, v: impl Into<String>) -> Self {
self.lt_coin = Some(v.into());
self
}
pub fn with_order_id(mut self, v: impl Into<String>) -> Self {
self.order_id = Some(v.into());
self
}
pub fn with_start_time(mut self, v: Timestamp) -> Self {
self.start_time = Some(v);
self
}
pub fn with_end_time(mut self, v: Timestamp) -> Self {
self.end_time = Some(v);
self
}
pub fn with_limit(mut self, v: u64) -> Self {
self.limit = Some(v);
self
}
pub fn with_lt_order_type(mut self, v: LtOrderType) -> Self {
self.lt_order_type = Some(v);
self
}
pub fn with_serial_no(mut self, v: impl Into<String>) -> Self {
self.serial_no = Some(v.into());
self
}
}
impl Default for GetLeverageTokenOrderRecordsParams {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct LeverageTokenOrderRecord {
pub lt_coin: String,
pub order_id: String,
pub lt_order_type: LtOrderType,
pub order_time: Timestamp,
pub update_time: Timestamp,
pub lt_order_status: LtOrderStatus,
pub fee: Decimal,
pub amount: Decimal,
pub value: Decimal,
pub value_coin: String,
#[serde(default, deserialize_with = "empty_string_as_none")]
pub serial_no: Option<String>,
}