coinbase_advanced/models/
portfolio.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
7#[serde(rename_all = "UPPERCASE")]
8pub enum PortfolioType {
9 Default,
11 Consumer,
13 Intx,
15 #[serde(other)]
17 Undefined,
18}
19
20#[derive(Debug, Clone, Deserialize)]
22pub struct Portfolio {
23 pub name: String,
25 pub uuid: String,
27 #[serde(rename = "type")]
29 pub portfolio_type: PortfolioType,
30 #[serde(default)]
32 pub deleted: bool,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct PortfolioBalance {
38 pub value: String,
40 pub currency: String,
42}
43
44#[derive(Debug, Clone, Deserialize)]
46pub struct PortfolioBalances {
47 pub total_balance: PortfolioBalance,
49 #[serde(default)]
51 pub total_futures_balance: Option<PortfolioBalance>,
52 #[serde(default)]
54 pub total_cash_equivalent_balance: Option<PortfolioBalance>,
55 #[serde(default)]
57 pub total_crypto_balance: Option<PortfolioBalance>,
58 #[serde(default)]
60 pub futures_unrealized_pnl: Option<PortfolioBalance>,
61 #[serde(default)]
63 pub perp_unrealized_pnl: Option<PortfolioBalance>,
64}
65
66#[derive(Debug, Clone, Deserialize)]
68pub struct SpotPosition {
69 pub asset: String,
71 pub account_uuid: String,
73 #[serde(default)]
75 pub total_balance_fiat: f64,
76 #[serde(default)]
78 pub total_balance_crypto: f64,
79 #[serde(default)]
81 pub available_to_trade_fiat: f64,
82 #[serde(default)]
84 pub allocation: f64,
85 #[serde(default)]
87 pub cost_basis: Option<PortfolioBalance>,
88 #[serde(default)]
90 pub asset_img_url: Option<String>,
91 #[serde(default)]
93 pub is_cash: bool,
94}
95
96#[derive(Debug, Clone, Deserialize)]
98pub struct PortfolioBreakdown {
99 pub portfolio: Portfolio,
101 #[serde(default)]
103 pub portfolio_balances: Option<PortfolioBalances>,
104 #[serde(default)]
106 pub spot_positions: Vec<SpotPosition>,
107 #[serde(default)]
109 pub perp_positions: Vec<serde_json::Value>,
110 #[serde(default)]
112 pub futures_positions: Vec<serde_json::Value>,
113}
114
115#[derive(Debug, Clone, Deserialize)]
117pub struct ListPortfoliosResponse {
118 pub portfolios: Vec<Portfolio>,
120}
121
122#[derive(Debug, Clone, Deserialize)]
124pub struct GetPortfolioBreakdownResponse {
125 pub breakdown: PortfolioBreakdown,
127}
128
129#[derive(Debug, Clone, Deserialize)]
131pub struct PortfolioResponse {
132 pub portfolio: Portfolio,
134}
135
136#[derive(Debug, Clone, Default, Serialize)]
138pub struct ListPortfoliosParams {
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub portfolio_type: Option<String>,
142}
143
144impl ListPortfoliosParams {
145 pub fn new() -> Self {
147 Self::default()
148 }
149
150 pub fn portfolio_type(mut self, portfolio_type: impl Into<String>) -> Self {
152 self.portfolio_type = Some(portfolio_type.into());
153 self
154 }
155}
156
157#[derive(Debug, Clone, Serialize)]
159pub struct CreatePortfolioRequest {
160 pub name: String,
162}
163
164impl CreatePortfolioRequest {
165 pub fn new(name: impl Into<String>) -> Self {
167 Self { name: name.into() }
168 }
169}
170
171#[derive(Debug, Clone, Serialize)]
173pub struct EditPortfolioRequest {
174 pub name: String,
176}
177
178impl EditPortfolioRequest {
179 pub fn new(name: impl Into<String>) -> Self {
181 Self { name: name.into() }
182 }
183}
184
185#[derive(Debug, Clone, Serialize)]
187pub struct MoveFunds {
188 pub value: String,
190 pub currency: String,
192}
193
194impl MoveFunds {
195 pub fn new(value: impl Into<String>, currency: impl Into<String>) -> Self {
197 Self {
198 value: value.into(),
199 currency: currency.into(),
200 }
201 }
202}
203
204#[derive(Debug, Clone, Serialize)]
206pub struct MoveFundsRequest {
207 pub funds: MoveFunds,
209 pub source_portfolio_uuid: String,
211 pub target_portfolio_uuid: String,
213}
214
215impl MoveFundsRequest {
216 pub fn new(
218 funds: MoveFunds,
219 source_portfolio_uuid: impl Into<String>,
220 target_portfolio_uuid: impl Into<String>,
221 ) -> Self {
222 Self {
223 funds,
224 source_portfolio_uuid: source_portfolio_uuid.into(),
225 target_portfolio_uuid: target_portfolio_uuid.into(),
226 }
227 }
228}
229
230#[derive(Debug, Clone, Deserialize)]
232pub struct MoveFundsResponse {
233 pub source_portfolio_uuid: String,
235 pub target_portfolio_uuid: String,
237}