Skip to main content

polyester/codecs/decode/
market_overview.rs

1//! Market overview decoders.
2
3use 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}