nash_protocol/protocol/list_candles/
response.rs

1use super::types::ListCandlesResponse;
2use crate::errors::{ProtocolError, Result};
3use crate::graphql::list_candles;
4use crate::types::{Candle, CandleInterval};
5use chrono::{DateTime, Utc};
6use bigdecimal::BigDecimal;
7use std::str::FromStr;
8use crate::protocol::traits::TryFromState;
9use crate::protocol::state::State;
10use std::sync::Arc;
11use tokio::sync::RwLock;
12use async_trait::async_trait;
13
14
15#[async_trait]
16impl TryFromState<list_candles::ResponseData> for ListCandlesResponse {
17    async fn from(response: list_candles::ResponseData, _state: Arc<RwLock<State>>) -> Result<ListCandlesResponse> {
18        let mut candles = Vec::new();
19        for candle_data in response.list_candles.candles {
20            let a_volume = BigDecimal::from_str(&candle_data.a_volume.amount)?;
21            let b_volume = BigDecimal::from_str(&candle_data.b_volume.amount)?;
22            let low_price = BigDecimal::from_str(&candle_data.low_price.amount)?;
23            let open_price = BigDecimal::from_str(&candle_data.open_price.amount)?;
24            let close_price = BigDecimal::from_str(&candle_data.close_price.amount)?;
25            let high_price = BigDecimal::from_str(&candle_data.high_price.amount)?;
26            candles.push(Candle {
27                a_volume,
28                b_volume,
29                high_price,
30                low_price,
31                open_price,
32                close_price,
33                interval: candle_data.interval.into(),
34                interval_start: DateTime::<Utc>::from_str(&candle_data.interval_starting_at)
35                    .map_err(|_| ProtocolError("Could not convert value to DateTime"))?,
36            })
37        }
38        Ok(ListCandlesResponse {
39            candles,
40            next_page: response.list_candles.next.clone(),
41        })
42    }
43}
44
45impl From<list_candles::CandleInterval> for CandleInterval {
46    fn from(interval: list_candles::CandleInterval) -> Self {
47        match interval {
48            list_candles::CandleInterval::FIFTEEN_MINUTE => CandleInterval::FifteenMinute,
49            list_candles::CandleInterval::FIVE_MINUTE => CandleInterval::FiveMinute,
50            list_candles::CandleInterval::FOUR_HOUR => CandleInterval::FourHour,
51            list_candles::CandleInterval::ONE_DAY => CandleInterval::OneDay,
52            list_candles::CandleInterval::ONE_HOUR => CandleInterval::OneHour,
53            list_candles::CandleInterval::SIX_HOUR => CandleInterval::SixHour,
54            list_candles::CandleInterval::THIRTY_MINUTE => CandleInterval::ThirtyMinute,
55            list_candles::CandleInterval::THREE_HOUR => CandleInterval::ThreeHour,
56            list_candles::CandleInterval::TWELVE_HOUR => CandleInterval::TwelveHour,
57            list_candles::CandleInterval::ONE_MONTH => CandleInterval::OneMonth,
58            list_candles::CandleInterval::ONE_WEEK => CandleInterval::OneWeek,
59            list_candles::CandleInterval::ONE_MINUTE => CandleInterval::OneMinute,
60            _ => panic!("Unsupported interval"),
61        }
62    }
63}