deribit/models/subscription/channels/
user_portfolio.rs

1use 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, //for portfolio margining users
33    pub projected_delta_total: f64,
34    pub projected_maintenance_margin: f64, //for portfolio margining users
35    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}