use std::sync::Arc;
use serde::de::DeserializeOwned;
use crate::error::Error;
use crate::http::{enc, HttpClient};
use crate::pagination::Page;
use crate::params::Params;
pub struct Coins {
http: Arc<HttpClient>,
}
impl Coins {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn list<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
Page::fetch(self.http.clone(), "/api/v1/coins", params)
}
pub fn recently_added<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
Page::fetch(self.http.clone(), "/api/v1/coins/recently-added", params)
}
pub fn gainers<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
Page::fetch(self.http.clone(), "/api/v1/coins/gainers", params)
}
pub fn losers<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
Page::fetch(self.http.clone(), "/api/v1/coins/losers", params)
}
pub fn trending<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/coins/trending", ¶ms)
}
pub fn get<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}", enc(slug)), ¶ms)
}
pub fn history<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}/history", enc(slug)), ¶ms)
}
pub fn marketcap_history<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}/marketcap-history", enc(slug)), ¶ms)
}
pub fn sparkline<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}/sparkline", enc(slug)), ¶ms)
}
}
pub struct Prices {
http: Arc<HttpClient>,
}
impl Prices {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn list<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/prices", ¶ms)
}
pub fn get<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/prices/{}", enc(slug)), ¶ms)
}
pub fn historical<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/historical-price", ¶ms)
}
}
pub struct Conversion {
http: Arc<HttpClient>,
}
impl Conversion {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn convert<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/convert", ¶ms)
}
pub fn fiats<T: DeserializeOwned>(&self) -> Result<T, Error> {
self.http.get("/api/v1/fiats", &Params::new())
}
pub fn rates<T: DeserializeOwned>(&self) -> Result<T, Error> {
self.http.get("/api/v1/rates", &Params::new())
}
}