use std::sync::Arc;
use serde::de::DeserializeOwned;
use crate::error::Error;
use crate::http::{enc, HttpClient};
use crate::params::Params;
pub struct Indicators {
http: Arc<HttpClient>,
}
impl Indicators {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
fn indicator<T: DeserializeOwned>(&self, slug: &str, name: &str, params: Params) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}/indicators/{}", enc(slug), name), ¶ms)
}
pub fn snapshot<T: DeserializeOwned>(&self, slug: &str) -> Result<T, Error> {
self.http.get(&format!("/api/v1/coins/{}/indicators", enc(slug)), &Params::new())
}
pub fn rsi<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "rsi", params)
}
pub fn stoch_rsi<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "stoch-rsi", params)
}
pub fn sma<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "sma", params)
}
pub fn cci<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "cci", params)
}
pub fn mfi<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "mfi", params)
}
pub fn williams_r<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "williams-r", params)
}
pub fn price_volatility<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "price-volatility", params)
}
pub fn volume_volatility<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "volume-volatility", params)
}
pub fn macd<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "macd", params)
}
pub fn obv<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "obv", params)
}
pub fn adx<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "adx", params)
}
pub fn vwap<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "vwap", params)
}
pub fn cmf<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
self.indicator(slug, "cmf", params)
}
}
pub struct Calculators {
http: Arc<HttpClient>,
}
impl Calculators {
pub(crate) fn new(http: Arc<HttpClient>) -> Self {
Self { http }
}
pub fn dca<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/calculators/dca", ¶ms)
}
pub fn profit_loss<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/calculators/profit-loss", ¶ms)
}
pub fn compound_interest<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/calculators/compound-interest", ¶ms)
}
pub fn loan<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/calculators/loan", ¶ms)
}
pub fn staking<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
self.http.get("/api/v1/calculators/staking", ¶ms)
}
}