o2_api_types/domain/
depth.rs1use 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#[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#[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}