use std::fmt;
use serde::{Deserialize, Deserializer};
use crate::model::NumberString;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct AccountBill {
#[serde(default)]
pub bill_id: String,
#[serde(default)]
pub inst_type: String,
#[serde(default)]
pub inst_id: String,
#[serde(default)]
pub ccy: String,
#[serde(default)]
pub mgn_mode: String,
#[serde(rename = "type", default)]
pub bill_type: String,
#[serde(default)]
pub sub_type: String,
#[serde(default)]
pub bal_chg: NumberString,
#[serde(default)]
pub sz: NumberString,
#[serde(default)]
pub bal: NumberString,
#[serde(default)]
pub pos_bal_chg: NumberString,
#[serde(default)]
pub pos_bal: NumberString,
#[serde(default)]
pub px: NumberString,
#[serde(default)]
pub pnl: NumberString,
#[serde(default)]
pub fee: NumberString,
#[serde(default)]
pub earn_amt: NumberString,
#[serde(default)]
pub earn_apr: NumberString,
#[serde(default)]
pub ord_id: String,
#[serde(default)]
pub exec_type: String,
#[serde(default)]
pub from: String,
#[serde(default)]
pub to: String,
#[serde(default)]
pub notes: String,
#[serde(default)]
pub interest: NumberString,
#[serde(default)]
pub tag: String,
#[serde(default)]
pub fill_time: NumberString,
#[serde(default)]
pub trade_id: String,
#[serde(default)]
pub cl_ord_id: String,
#[serde(default)]
pub fill_idx_px: NumberString,
#[serde(default)]
pub fill_mark_px: NumberString,
#[serde(default)]
pub fill_px_vol: NumberString,
#[serde(default)]
pub fill_px_usd: NumberString,
#[serde(default)]
pub fill_fwd_px: NumberString,
#[serde(default)]
pub fill_mark_vol: NumberString,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct BillSubtypeMapping {
#[serde(rename = "type", default)]
pub bill_type: String,
#[serde(default)]
pub type_desc: String,
#[serde(default)]
pub sub_type_details: Vec<BillSubtypeDetail>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct BillSubtypeDetail {
#[serde(default)]
pub sub_type: String,
#[serde(default)]
pub sub_type_desc: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum BillsHistoryArchiveStatus {
LinkAvailable,
Generating,
Unknown(String),
}
impl BillsHistoryArchiveStatus {
pub fn as_str(&self) -> &str {
match self {
Self::LinkAvailable => "true",
Self::Generating => "false",
Self::Unknown(value) => value,
}
}
}
impl From<&str> for BillsHistoryArchiveStatus {
fn from(value: &str) -> Self {
match value {
"true" => Self::LinkAvailable,
"false" => Self::Generating,
other => Self::Unknown(other.to_owned()),
}
}
}
impl fmt::Display for BillsHistoryArchiveStatus {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for BillsHistoryArchiveStatus {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Ok(Self::from(value.as_str()))
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ApplyBillsHistoryArchiveResult {
#[serde(rename = "result")]
pub status: BillsHistoryArchiveStatus,
#[serde(default)]
pub ts: NumberString,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum BillsHistoryArchiveFileState {
Finished,
Ongoing,
Failed,
Unknown(String),
}
impl BillsHistoryArchiveFileState {
pub fn as_str(&self) -> &str {
match self {
Self::Finished => "finished",
Self::Ongoing => "ongoing",
Self::Failed => "failed",
Self::Unknown(value) => value,
}
}
}
impl From<&str> for BillsHistoryArchiveFileState {
fn from(value: &str) -> Self {
match value {
"finished" => Self::Finished,
"ongoing" => Self::Ongoing,
"failed" => Self::Failed,
other => Self::Unknown(other.to_owned()),
}
}
}
impl fmt::Display for BillsHistoryArchiveFileState {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for BillsHistoryArchiveFileState {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Ok(Self::from(value.as_str()))
}
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct BillsHistoryArchiveFile {
#[serde(default)]
pub file_href: String,
pub state: BillsHistoryArchiveFileState,
#[serde(default)]
pub ts: NumberString,
}