Skip to main content

o2_api_types/domain/
depth.rs

1use crate::domain::book::{
2    MarketId,
3    Price,
4};
5use serde_with::{
6    DisplayFromStr,
7    serde_as,
8};
9use std::ops::Sub;
10
11#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
12pub struct DepthView {
13    pub precision: Precision,
14    pub buys: Vec<DepthPriceView>,
15    pub sells: Vec<DepthPriceView>,
16}
17
18#[serde_as]
19#[derive(Clone, Copy, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)]
20pub struct DepthPriceView {
21    #[serde_as(as = "DisplayFromStr")]
22    pub price: Price,
23    #[serde_as(as = "DisplayFromStr")]
24    pub quantity: u128,
25}
26
27#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq)]
28pub struct Precision(usize);
29
30impl Sub for Precision {
31    type Output = Self;
32
33    fn sub(self, rhs: Self) -> Self::Output {
34        let precision = self.0.saturating_sub(rhs.0);
35        Self(precision)
36    }
37}
38
39impl Precision {
40    pub const MIN: usize = 0;
41    pub const MAX: usize = 18;
42
43    pub fn new(precision: usize) -> Self {
44        let precision = precision.min(Self::MAX);
45        let precision = precision.max(Self::MIN);
46        Self(precision)
47    }
48
49    pub fn max() -> Self {
50        Self(Self::MAX)
51    }
52
53    pub fn min() -> Self {
54        Self(Self::MIN)
55    }
56
57    pub fn value(&self) -> usize {
58        self.0
59    }
60}
61
62#[derive(Clone, Default, Debug, serde::Deserialize, serde::Serialize)]
63pub struct DepthBookChanges {
64    pub buys: Vec<DepthBookChange>,
65    pub sells: Vec<DepthBookChange>,
66}
67
68#[serde_as]
69#[derive(Clone, Copy, Default, Debug, serde::Deserialize, serde::Serialize)]
70pub struct DepthBookChange {
71    #[serde_as(as = "DisplayFromStr")]
72    pub price: u64,
73    #[serde_as(as = "DisplayFromStr")]
74    pub quantity: i128,
75}
76
77/// Depth request params.
78#[serde_as]
79#[derive(serde::Deserialize, Debug)]
80pub struct GetDepthParams {
81    pub market_id: MarketId,
82    #[serde_as(as = "DisplayFromStr")]
83    pub precision: u64,
84}
85
86/// Depth response.
87#[derive(serde::Serialize)]
88pub struct GetDepthResponse {
89    pub action: String,
90    pub orders: DepthOrders,
91    pub market_id: MarketId,
92}
93
94#[serde_as]
95#[derive(serde::Serialize)]
96pub struct DepthOrders {
97    pub buys: Vec<DepthOrder>,
98    pub sells: Vec<DepthOrder>,
99}
100
101#[serde_as]
102#[derive(serde::Serialize)]
103pub struct DepthOrder {
104    #[serde_as(as = "DisplayFromStr")]
105    pub quantity: u128,
106    #[serde_as(as = "DisplayFromStr")]
107    pub price: u64,
108}