use std::sync::Arc;
use serde::de::DeserializeOwned;
use serde_json::{json, Value};
use crate::error::Error;
use crate::http::{enc, HttpClient};
use crate::pagination::Page;
use crate::params::Params;
pub struct GlobalMarket {
http: Arc<HttpClient>,
}
impl GlobalMarket {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn snapshot<T: DeserializeOwned>(&self) -> Result<T, Error> {
self.http.get("/api/v1/global", &Params::new())
}
pub fn heatmap<T: DeserializeOwned>(&self) -> Result<T, Error> {
self.http.get("/api/v1/global/heatmap", &Params::new())
}
pub fn history<T: DeserializeOwned>(&self, metric: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/global/history/{}", enc(metric)), ¶ms)
}
}
pub struct Sentiment {
http: Arc<HttpClient>,
}
impl Sentiment {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn votes<T: DeserializeOwned>(&self, slug: &str) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}/votes", enc(slug)), &Params::new())
}
pub fn vote(&self, slug: &str, vote: &str) -> Result<Value, Error> {
self.http.post_value(&format!("/api/v1/coins/{}/votes", enc(slug)), Some(json!({ "vote": vote })))
}
pub fn fear_greed<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/sentiment/fear-greed", ¶ms)
}
pub fn bull_bear<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/sentiment/bull-bear", ¶ms)
}
pub fn altseason<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/sentiment/altseason", ¶ms)
}
pub fn indicators<T: DeserializeOwned>(&self) -> Result<T, Error> {
self.http.get("/api/v1/sentiment/indicators", &Params::new())
}
}
pub struct Liquidations {
http: Arc<HttpClient>,
}
impl Liquidations {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn feed<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
Page::fetch(self.http.clone(), "/api/v1/liquidations", params)
}
pub fn hourly<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/liquidations/hourly", ¶ms)
}
pub fn daily<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/liquidations/daily", ¶ms)
}
pub fn summary<T: DeserializeOwned>(&self) -> Result<T, Error> {
self.http.get("/api/v1/liquidations/summary", &Params::new())
}
pub fn netflow<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/liquidations/netflow", ¶ms)
}
pub fn coins<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/liquidations/coins", ¶ms)
}
}