use std::fmt;
use serde::{Deserialize, Deserializer};
use crate::model::{NumberString, OrderSide};
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConvertCurrency {
pub ccy: String,
#[serde(default)]
pub min: NumberString,
#[serde(default)]
pub max: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConvertCurrencyPair {
pub inst_id: String,
pub base_ccy: String,
pub base_ccy_max: NumberString,
pub base_ccy_min: NumberString,
pub quote_ccy: String,
pub quote_ccy_max: NumberString,
pub quote_ccy_min: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConvertQuote {
pub quote_time: NumberString,
pub ttl_ms: NumberString,
#[serde(default)]
pub cl_q_req_id: String,
pub quote_id: String,
pub base_ccy: String,
pub quote_ccy: String,
pub side: OrderSide,
pub orig_rfq_sz: NumberString,
pub rfq_sz: NumberString,
pub rfq_sz_ccy: String,
pub cnvt_px: NumberString,
pub base_sz: NumberString,
pub quote_sz: NumberString,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum ConvertTradeState {
FullyFilled,
Rejected,
Unknown(String),
}
impl ConvertTradeState {
pub fn as_str(&self) -> &str {
match self {
Self::FullyFilled => "fullyFilled",
Self::Rejected => "rejected",
Self::Unknown(value) => value,
}
}
}
impl From<&str> for ConvertTradeState {
fn from(value: &str) -> Self {
match value {
"fullyFilled" => Self::FullyFilled,
"rejected" => Self::Rejected,
other => Self::Unknown(other.to_owned()),
}
}
}
impl fmt::Display for ConvertTradeState {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for ConvertTradeState {
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 ConvertTradeResult {
pub trade_id: String,
pub quote_id: String,
#[serde(default)]
pub cl_t_req_id: String,
pub state: ConvertTradeState,
pub inst_id: String,
pub base_ccy: String,
pub quote_ccy: String,
pub side: OrderSide,
pub fill_px: NumberString,
pub fill_base_sz: NumberString,
pub fill_quote_sz: NumberString,
pub ts: NumberString,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub struct ConvertHistory {
pub trade_id: String,
#[serde(default)]
pub cl_t_req_id: String,
pub state: ConvertTradeState,
pub inst_id: String,
pub base_ccy: String,
pub quote_ccy: String,
pub side: OrderSide,
pub fill_px: NumberString,
pub fill_base_sz: NumberString,
pub fill_quote_sz: NumberString,
pub ts: NumberString,
}