coinbase_advanced/models/
convert.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
7pub enum ConvertTradeStatus {
8 #[serde(rename = "TRADE_STATUS_UNSPECIFIED")]
10 Unspecified,
11 #[serde(rename = "TRADE_STATUS_CREATED")]
13 Created,
14 #[serde(rename = "TRADE_STATUS_STARTED")]
16 Started,
17 #[serde(rename = "TRADE_STATUS_COMPLETED")]
19 Completed,
20 #[serde(rename = "TRADE_STATUS_CANCELED")]
22 Canceled,
23 #[serde(other)]
25 Unknown,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct ConvertAmount {
31 pub value: String,
33 pub currency: String,
35}
36
37#[derive(Debug, Clone, Deserialize)]
39pub struct ConvertFee {
40 #[serde(default)]
42 pub title: Option<String>,
43 #[serde(default)]
45 pub description: Option<String>,
46 pub amount: ConvertAmount,
48 #[serde(default)]
50 pub label: Option<String>,
51}
52
53#[derive(Debug, Clone, Deserialize)]
55pub struct ConvertAccountDetail {
56 #[serde(rename = "type", default)]
58 pub account_type: Option<String>,
59 #[serde(default)]
61 pub network: Option<String>,
62 #[serde(default)]
64 pub ledger_account: Option<serde_json::Value>,
65}
66
67#[derive(Debug, Clone, Deserialize)]
69pub struct ConvertTrade {
70 pub id: String,
72 pub status: ConvertTradeStatus,
74 #[serde(default)]
76 pub user_entered_amount: Option<ConvertAmount>,
77 #[serde(default)]
79 pub amount: Option<ConvertAmount>,
80 #[serde(default)]
82 pub subtotal: Option<ConvertAmount>,
83 #[serde(default)]
85 pub total: Option<ConvertAmount>,
86 #[serde(default)]
88 pub fees: Vec<ConvertFee>,
89 #[serde(default)]
91 pub total_fee: Option<ConvertFee>,
92 #[serde(default)]
94 pub source: Option<ConvertAccountDetail>,
95 #[serde(default)]
97 pub target: Option<ConvertAccountDetail>,
98 #[serde(default)]
100 pub source_currency: Option<String>,
101 #[serde(default)]
103 pub target_currency: Option<String>,
104 #[serde(default)]
106 pub source_id: Option<String>,
107 #[serde(default)]
109 pub target_id: Option<String>,
110 #[serde(default)]
112 pub exchange_rate: Option<ConvertAmount>,
113 #[serde(default)]
115 pub user_reference: Option<String>,
116}
117
118#[derive(Debug, Clone, Deserialize)]
120pub struct ConvertTradeResponse {
121 pub trade: ConvertTrade,
123}
124
125#[derive(Debug, Clone, Default, Serialize)]
127pub struct TradeIncentiveMetadata {
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub user_incentive_id: Option<String>,
131 #[serde(skip_serializing_if = "Option::is_none")]
133 pub code_val: Option<String>,
134}
135
136#[derive(Debug, Clone, Serialize)]
138pub struct CreateConvertQuoteRequest {
139 pub from_account: String,
141 pub to_account: String,
143 pub amount: String,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub trade_incentive_metadata: Option<TradeIncentiveMetadata>,
148}
149
150impl CreateConvertQuoteRequest {
151 pub fn new(
153 from_account: impl Into<String>,
154 to_account: impl Into<String>,
155 amount: impl Into<String>,
156 ) -> Self {
157 Self {
158 from_account: from_account.into(),
159 to_account: to_account.into(),
160 amount: amount.into(),
161 trade_incentive_metadata: None,
162 }
163 }
164
165 pub fn with_incentive(mut self, metadata: TradeIncentiveMetadata) -> Self {
167 self.trade_incentive_metadata = Some(metadata);
168 self
169 }
170}
171
172#[derive(Debug, Clone, Serialize)]
174pub struct CommitConvertTradeRequest {
175 pub from_account: String,
177 pub to_account: String,
179}
180
181impl CommitConvertTradeRequest {
182 pub fn new(from_account: impl Into<String>, to_account: impl Into<String>) -> Self {
184 Self {
185 from_account: from_account.into(),
186 to_account: to_account.into(),
187 }
188 }
189}
190
191#[derive(Debug, Clone, Serialize)]
193pub struct GetConvertTradeParams {
194 pub from_account: String,
196 pub to_account: String,
198}
199
200impl GetConvertTradeParams {
201 pub fn new(from_account: impl Into<String>, to_account: impl Into<String>) -> Self {
203 Self {
204 from_account: from_account.into(),
205 to_account: to_account.into(),
206 }
207 }
208}