polyester/codecs/decode/
market_overview.rs1use super::money::decode_price_ticks;
4use crate::models::{MarketOverviewEntry, MarketOverviewList};
5use crate::proto::marketoverview::v1::{
6 ListMarketOverviewResponse, MarketOverview as ProtoMarketOverview, MarketOverviewBatch,
7};
8
9pub fn market_overview_entry_from_proto(msg: &ProtoMarketOverview) -> MarketOverviewEntry {
10 MarketOverviewEntry {
11 symbol_id: msg.symbol_id,
12 symbol: msg.symbol.clone(),
13 last_price: decode_price_ticks(msg.last_price_ticks, Some(msg.symbol.clone())),
14 }
15}
16
17pub fn market_overview_list_from_proto(msg: &ListMarketOverviewResponse) -> MarketOverviewList {
18 MarketOverviewList {
19 markets: msg
20 .markets
21 .iter()
22 .map(market_overview_entry_from_proto)
23 .collect(),
24 next_page_token: msg.next_page_token.clone(),
25 }
26}
27
28pub fn market_overview_batch_from_proto(msg: &MarketOverviewBatch) -> MarketOverviewList {
29 MarketOverviewList {
30 markets: msg
31 .markets
32 .iter()
33 .map(market_overview_entry_from_proto)
34 .collect(),
35 next_page_token: String::new(),
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn overview_maps_last_price() {
45 let msg = ListMarketOverviewResponse {
46 markets: vec![ProtoMarketOverview {
47 symbol_id: 2,
48 symbol: "ETH-USDT".into(),
49 last_price_ticks: 2_000_000,
50 ..Default::default()
51 }],
52 next_page_token: "tok".into(),
53 ..Default::default()
54 };
55 let list = market_overview_list_from_proto(&msg);
56 assert_eq!(list.markets.len(), 1);
57 assert_eq!(list.markets[0].symbol, "ETH-USDT");
58 assert_eq!(
59 list.markets[0].last_price.as_ref().unwrap().as_ticks(),
60 2_000_000
61 );
62 assert_eq!(list.next_page_token, "tok");
63 }
64}