use crate::gecko;
use crate::types::Response;
use serde_json;
pub enum Order {
GeckoDesc,
GeckoAsc,
MarketCapDesc,
MarketCapAsc,
VolumeDesc,
VolumeAsc,
IdDesc,
IdAsc,
}
impl Order {
fn as_str(&self) -> &'static str {
match self {
Order::GeckoDesc => "gecko_desc",
Order::GeckoAsc => "gecko_asc",
Order::MarketCapDesc => "market_cap_desc",
Order::MarketCapAsc => "market_cap_asc",
Order::VolumeDesc => "volume_desc",
Order::VolumeAsc => "volume_asc",
Order::IdDesc => "id_desc",
Order::IdAsc => "id_asc",
}
}
}
pub enum TickersOrder {
TrustScoreDesc,
TrustScoreAsc,
VolumeDesc,
}
impl TickersOrder {
fn as_str(&self) -> &'static str {
match self {
TickersOrder::TrustScoreDesc => "trust_score_desc",
TickersOrder::TrustScoreAsc => "trust_score_asc",
TickersOrder::VolumeDesc => "volume_desc",
}
}
}
pub fn list(include_platform: Option<bool>) -> Response<serde_json::Value> {
let params = gecko::append_if(
&mut String::from("?"),
!include_platform.is_none(),
Some(&["include_platform", &include_platform.unwrap().to_string()].join("=")),
None,
);
let response = gecko::get_request("/coins/list", ¶ms);
response
}
pub fn markets(
vs_currency: &str,
ids: Option<Vec<&str>>,
category: Option<&str>,
order: Option<Order>,
) -> Response<serde_json::Value> {
let mut params = ["?vs_currency", vs_currency].join("=");
if !ids.is_none() {
params.push_str(&["&ids", &gecko::vec_str_2_comma_str(ids.unwrap())].join("="));
}
if !category.is_none() {
params.push_str(&["&category", &category.unwrap()].join("="));
}
if !order.is_none() {
params.push_str(&["&order", &order.unwrap().as_str()].join("="));
}
let response = gecko::get_request("/coins/markets", ¶ms);
response
}
pub fn get(
id: &str,
localization: Option<bool>,
tickers: Option<bool>,
market_data: Option<bool>,
community_data: Option<bool>,
developer_data: Option<bool>,
sparkline: Option<bool>,
) -> Response<serde_json::Value> {
let loc = localization.unwrap_or(true);
let tik = tickers.unwrap_or(true);
let m_d = market_data.unwrap_or(true);
let c_d = community_data.unwrap_or(true);
let d_d = developer_data.unwrap_or(true);
let spk = sparkline.unwrap_or(false);
let mut params = gecko::append_if(
"?",
loc,
Some("localization=true"),
Some("localization=false"),
);
params = gecko::append_if(¶ms, tik, Some("tickers=true"), Some("tickers=false"));
params = gecko::append_if(
¶ms,
m_d,
Some("market_data=true"),
Some("market_data=false"),
);
params = gecko::append_if(
¶ms,
c_d,
Some("community_data=true"),
Some("community_data=false"),
);
params = gecko::append_if(
¶ms,
d_d,
Some("developer_data=true"),
Some("developer_data=false"),
);
params = gecko::append_if(
¶ms,
spk,
Some("sparkline=true"),
Some("sparkline=false"),
);
let response = gecko::get_request(&["/coins", id].join("/"), ¶ms);
response
}
pub fn tickers(
id: &str,
exchange_ids: Option<Vec<&str>>,
include_exchange_logo: Option<bool>,
page: Option<u16>,
order: Option<TickersOrder>,
depth: Option<bool>,
) -> Response<serde_json::Value> {
let mut params = gecko::append_if(
"?",
!exchange_ids.is_none(),
Some(&gecko::vec_str_2_comma_str(
exchange_ids.unwrap_or(vec![""]),
)),
None,
);
params = gecko::append_if(
¶ms,
include_exchange_logo.unwrap_or(false),
Some(&"include_exchange_logo"),
None,
);
params = gecko::append_if(
¶ms,
!page.is_none(),
Some(&["page", &page.unwrap_or(0).to_string()].join("=")),
None,
);
params = gecko::append_if(
¶ms,
!order.is_none(),
Some(
&[
"order",
order.unwrap_or(TickersOrder::TrustScoreDesc).as_str(),
]
.join("="),
),
None,
);
params = gecko::append_if(¶ms, depth.unwrap_or(false), Some("depth=true"), None);
let response = gecko::get_request(&["/coins", id, "tickers"].join("/"), ¶ms);
response
}
pub fn history(id: &str, date: &str, localization: Option<bool>) -> Response<serde_json::Value> {
let mut params = ["?date", date].join("=");
params = gecko::append_if(
¶ms,
localization.unwrap_or(false),
Some("&localization"),
None,
);
let response = gecko::get_request(&["/coins", id, "history"].join("/"), ¶ms);
response
}
pub fn market_chart(
id: &str,
vs_currency: &str,
days: &str,
interval: Option<&str>,
) -> Response<serde_json::Value> {
let mut params = ["?vs_currency", vs_currency, "&days", days].join("=");
if !interval.is_none() {
params.push_str(&["&interval", interval.unwrap()].join("="));
}
let response = gecko::get_request(&["/coins", id, "market_chart"].join("/"), ¶ms);
response
}
pub fn market_chart_range(
id: &str,
vs_currency: &str,
from: &str,
to: &str,
) -> Response<serde_json::Value> {
let response = gecko::get_request(
&["/coins", id, "market_chart", "range"].join("/"),
&["?vs_currency", vs_currency, "&from", from, "&to", to].join("="),
);
response
}
pub fn ohlc(id: &str, vs_currency: &str, days: &str) -> Response<serde_json::Value> {
let response = gecko::get_request(
&["/coins", id, "ohlc"].join("/"),
&["?vs_currency", vs_currency, "&days", days].join("="),
);
response
}