bitculator 1.1.0

Official Rust SDK for the Bitculator Data API
Documentation
use std::sync::Arc;

use serde::de::DeserializeOwned;

use crate::error::Error;
use crate::http::{enc, HttpClient};
use crate::params::Params;

/// Technical indicators for a coin.
///
/// Period indicators (rsi, stoch_rsi, sma, cci, mfi, williams_r,
/// price_volatility, volume_volatility) accept: period, start, end, limit.
/// Series indicators (macd, obv, adx, vwap, cmf) accept: start, end, limit.
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), &params)
    }

    /// All indicators for a coin at a glance.
    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)
    }
}

/// Financial calculators.
pub struct Calculators {
    http: Arc<HttpClient>,
}

impl Calculators {
    pub(crate) fn new(http: Arc<HttpClient>) -> Self {
        Self { http }
    }

    /// Dollar-cost-averaging calculator. Params: slug, amount, interval, start, end, series.
    pub fn dca<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/calculators/dca", &params)
    }

    /// Profit / loss calculator. Params: slug, amount, buy_date, sell_date, buy_fee, sell_fee.
    pub fn profit_loss<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/calculators/profit-loss", &params)
    }

    /// Compound interest calculator. Params: principal, rate, duration,
    /// duration_unit, compound_frequency, contribution, contribution_frequency.
    /// `rate` is the annual nominal rate in %; each compounding period earns
    /// `rate` divided by the periods per year.
    pub fn compound_interest<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/calculators/compound-interest", &params)
    }

    /// Loan-vs-sell calculator. Params: slug, crypto_amount, needed_cash,
    /// term_months, interest_rate, ltv, expected_growth, tax_rate.
    pub fn loan<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/calculators/loan", &params)
    }

    /// Staking rewards calculator. Params: amount, period, period_unit, apy,
    /// compound_frequency, commission.
    pub fn staking<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/calculators/staking", &params)
    }
}