nash_protocol/protocol/list_candles/
response.rs1use 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}