deribit/models/subscription/channels/
user_portfolio.rs1use crate::models::Currency;
2use fehler::throw;
3use serde::{
4 de::{Error, Unexpected},
5 Deserialize, Deserializer, Serialize, Serializer,
6};
7
8#[derive(Deserialize, Serialize, Debug, Clone)]
9pub struct UserPortfolioData {
10 pub available_funds: f64,
11 pub available_withdrawal_funds: f64,
12 pub balance: f64,
13 pub currency: Currency,
14 pub delta_total: f64,
15 pub equity: f64,
16 pub estimated_liquidation_ratio: f64,
17 pub futures_pl: f64,
18 pub futures_session_rpl: f64,
19 pub futures_session_upl: f64,
20 pub initial_margin: f64,
21 pub maintenance_margin: f64,
22 pub margin_balance: f64,
23 pub options_delta: f64,
24 pub options_gamma: f64,
25 pub options_pl: f64,
26 pub options_session_rpl: f64,
27 pub options_session_upl: f64,
28 pub options_theta: f64,
29 pub options_vega: f64,
30 pub options_value: f64,
31 pub portfolio_margining_enabled: bool,
32 pub projected_initial_margin: f64, pub projected_delta_total: f64,
34 pub projected_maintenance_margin: f64, pub session_rpl: f64,
36 pub session_upl: f64,
37 pub total_pl: f64,
38}
39
40#[derive(Debug, Clone)]
41pub struct UserPortfolioChannel(String);
42impl<'de> Deserialize<'de> for UserPortfolioChannel {
43 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44 where
45 D: Deserializer<'de>,
46 {
47 let s = <&str as Deserialize<'de>>::deserialize(deserializer)?;
48 let segments: Vec<_> = s.split(".").collect();
49 match segments.as_slice() {
50 ["user", "portfolio", currency] => Ok(UserPortfolioChannel(currency.to_string())),
51 _ => throw!(D::Error::invalid_value(
52 Unexpected::Str(s),
53 &"user.portfolio.{currency}"
54 )),
55 }
56 }
57}
58impl Serialize for UserPortfolioChannel {
59 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
60 where
61 S: Serializer,
62 {
63 serializer.serialize_str(&self.to_string())
64 }
65}
66
67impl std::fmt::Display for UserPortfolioChannel {
68 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69 write!(f, "user.portfolio.{}", self.0)
70 }
71}