use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
pub enum ConvertTradeStatus {
#[serde(rename = "TRADE_STATUS_UNSPECIFIED")]
Unspecified,
#[serde(rename = "TRADE_STATUS_CREATED")]
Created,
#[serde(rename = "TRADE_STATUS_STARTED")]
Started,
#[serde(rename = "TRADE_STATUS_COMPLETED")]
Completed,
#[serde(rename = "TRADE_STATUS_CANCELED")]
Canceled,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConvertAmount {
pub value: String,
pub currency: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ConvertFee {
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub description: Option<String>,
pub amount: ConvertAmount,
#[serde(default)]
pub label: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ConvertAccountDetail {
#[serde(rename = "type", default)]
pub account_type: Option<String>,
#[serde(default)]
pub network: Option<String>,
#[serde(default)]
pub ledger_account: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ConvertTrade {
pub id: String,
pub status: ConvertTradeStatus,
#[serde(default)]
pub user_entered_amount: Option<ConvertAmount>,
#[serde(default)]
pub amount: Option<ConvertAmount>,
#[serde(default)]
pub subtotal: Option<ConvertAmount>,
#[serde(default)]
pub total: Option<ConvertAmount>,
#[serde(default)]
pub fees: Vec<ConvertFee>,
#[serde(default)]
pub total_fee: Option<ConvertFee>,
#[serde(default)]
pub source: Option<ConvertAccountDetail>,
#[serde(default)]
pub target: Option<ConvertAccountDetail>,
#[serde(default)]
pub source_currency: Option<String>,
#[serde(default)]
pub target_currency: Option<String>,
#[serde(default)]
pub source_id: Option<String>,
#[serde(default)]
pub target_id: Option<String>,
#[serde(default)]
pub exchange_rate: Option<ConvertAmount>,
#[serde(default)]
pub user_reference: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ConvertTradeResponse {
pub trade: ConvertTrade,
}
#[derive(Debug, Clone, Default, Serialize)]
pub struct TradeIncentiveMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub user_incentive_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_val: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateConvertQuoteRequest {
pub from_account: String,
pub to_account: String,
pub amount: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub trade_incentive_metadata: Option<TradeIncentiveMetadata>,
}
impl CreateConvertQuoteRequest {
pub fn new(
from_account: impl Into<String>,
to_account: impl Into<String>,
amount: impl Into<String>,
) -> Self {
Self {
from_account: from_account.into(),
to_account: to_account.into(),
amount: amount.into(),
trade_incentive_metadata: None,
}
}
pub fn with_incentive(mut self, metadata: TradeIncentiveMetadata) -> Self {
self.trade_incentive_metadata = Some(metadata);
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct CommitConvertTradeRequest {
pub from_account: String,
pub to_account: String,
}
impl CommitConvertTradeRequest {
pub fn new(from_account: impl Into<String>, to_account: impl Into<String>) -> Self {
Self {
from_account: from_account.into(),
to_account: to_account.into(),
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct GetConvertTradeParams {
pub from_account: String,
pub to_account: String,
}
impl GetConvertTradeParams {
pub fn new(from_account: impl Into<String>, to_account: impl Into<String>) -> Self {
Self {
from_account: from_account.into(),
to_account: to_account.into(),
}
}
}