use crate::{config::HttpsConfig, prelude::*, Currency, Error, ErrorKind, Price, TradingPair};
use iqhttp::{HttpsClient, Query};
use serde::{Deserialize, Serialize};
pub const API_HOST: &str = "api.bithumb.com";
pub struct BithumbSource {
https_client: HttpsClient,
}
impl BithumbSource {
pub fn new(config: &HttpsConfig) -> Result<Self, Error> {
let https_client = config.new_client(API_HOST)?;
Ok(Self { https_client })
}
pub async fn trading_pairs(&self, pair: &TradingPair) -> Result<Price, Error> {
if pair.1 != Currency::Krw {
fail!(ErrorKind::Currency, "trading pair must be with KRW");
}
let query = Query::new();
let api_response: Response = self
.https_client
.get_json("/public/ticker/luna_krw", &query)
.await?;
Ok(api_response.data.closing_price.parse::<Price>().unwrap())
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Response {
status: String,
pub data: Data,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Data {
opening_price: String,
pub closing_price: String,
min_price: String,
max_price: String,
units_traded: String,
acc_trade_value: String,
prev_closing_price: String,
#[serde(rename = "units_traded_24H")]
units_traded_24_h: String,
#[serde(rename = "acc_trade_value_24H")]
acc_trade_value_24_h: String,
#[serde(rename = "fluctate_24H")]
fluctate_24_h: String,
#[serde(rename = "fluctate_rate_24H")]
fluctate_rate_24_h: String,
date: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct PricePoint {
pub price: Price,
pub qty: String,
}
#[cfg(test)]
mod tests {
use super::BithumbSource;
#[tokio::test]
#[ignore]
async fn trading_pairs_ok() {
let pair = "LUNA/KRW".parse().unwrap();
let _price = BithumbSource::new(&Default::default())
.unwrap()
.trading_pairs(&pair)
.await
.unwrap();
}
#[tokio::test]
#[ignore]
async fn trading_pairs_404() {
let pair = "N/A".parse().unwrap();
let _err = BithumbSource::new(&Default::default())
.unwrap()
.trading_pairs(&pair)
.await
.err()
.unwrap();
}
}