1use derive_builder::Builder;
2use rust_decimal::Decimal;
3use time::OffsetDateTime;
4
5use crate::{Extensions, MarginMode, PositionSide, Symbol};
6
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[non_exhaustive]
9#[derive(Debug, Clone, PartialEq, Builder)]
10#[builder(pattern = "owned", setter(into))]
11pub struct Balance {
12 pub asset: String,
13 pub available: Decimal,
14 pub locked: Decimal,
15 pub total: Decimal,
16 #[cfg_attr(
17 feature = "serde",
18 serde(with = "time::serde::timestamp::milliseconds")
19 )]
20 pub timestamp: OffsetDateTime,
21 #[builder(default)]
22 pub extensions: Extensions,
23}
24
25impl Balance {
26 pub fn builder() -> BalanceBuilder {
27 BalanceBuilder::default()
28 }
29}
30
31#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
32#[non_exhaustive]
33#[derive(Debug, Clone, PartialEq, Builder)]
34#[builder(pattern = "owned", setter(into))]
35pub struct Position {
36 #[builder(default)]
37 pub position_id: Option<String>,
38 pub symbol: Symbol,
39 pub side: PositionSide,
40 #[builder(default)]
41 pub margin_mode: Option<MarginMode>,
42 pub quantity: Decimal,
43 #[builder(default)]
44 pub entry_price: Option<Decimal>,
45 #[builder(default)]
46 pub mark_price: Option<Decimal>,
47 #[builder(default)]
48 pub unrealized_pnl: Option<Decimal>,
49 #[builder(default)]
50 pub leverage: Option<Decimal>,
51 #[builder(default)]
52 pub liquidation_price: Option<Decimal>,
53 #[cfg_attr(
54 feature = "serde",
55 serde(with = "time::serde::timestamp::milliseconds")
56 )]
57 pub updated_at: OffsetDateTime,
58 #[builder(default)]
59 pub extensions: Extensions,
60}
61
62impl Position {
63 pub fn builder() -> PositionBuilder {
64 PositionBuilder::default()
65 }
66}