trading_types/
depths.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{Depth, DepthMap};
6
7/// Special structure suitable to be a mutex-protected storage for depths of different sources (pairs)
8#[derive(Clone, Debug, Default, Serialize, Deserialize)]
9pub struct Depths {
10    pub vecs: HashMap<String, Depth>, // key can be any, usually str(symbol)
11    pub maps: HashMap<String, DepthMap>, // key can be any, usually str(symbol)
12}
13
14impl Depths {
15    pub fn new() -> Depths {
16        Depths {
17            vecs: Default::default(),
18            maps: Default::default(),
19        }
20    }
21
22    pub fn upsert(&mut self, key: &str, depth: Depth) {
23        let depth_map = depth.clone().into_depthmap();
24        self.maps.entry(key.into()).or_default().replace(depth_map);
25        self.vecs.entry(key.into()).or_default().replace(depth);
26    }
27
28    pub fn update(&mut self, key: &str, depth_change: Depth) {
29        let depth_map = depth_change.clone().into_depthmap();
30        self.maps
31            .entry(key.into())
32            .and_modify(|x| x.update(&depth_map))
33            .or_insert(depth_map);
34        self.vecs
35            .entry(key.into())
36            .and_modify(|x| *x = self.maps.get(key).unwrap().clone().into_depth())
37            .or_insert(depth_change);
38    }
39}