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::pagination::Page;
use crate::params::Params;

/// Coins & tokens: listings, movers, detail, and history.
pub struct Coins {
    http: Arc<HttpClient>,
}

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

    /// List coins (paginated). Params: page, per_page, type, status, search,
    /// min_price, max_price, min_marketcap, max_marketcap, min_volume,
    /// max_volume, ids, slugs, symbols, sort, interval.
    pub fn list<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
        Page::fetch(self.http.clone(), "/api/v1/coins", params)
    }

    /// Recently added coins (paginated).
    pub fn recently_added<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
        Page::fetch(self.http.clone(), "/api/v1/coins/recently-added", params)
    }

    /// Top gainers (paginated).
    pub fn gainers<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
        Page::fetch(self.http.clone(), "/api/v1/coins/gainers", params)
    }

    /// Top losers (paginated).
    pub fn losers<T: DeserializeOwned>(&self, params: Params) -> Result<Page<T>, Error> {
        Page::fetch(self.http.clone(), "/api/v1/coins/losers", params)
    }

    /// Trending coins. Params: limit.
    pub fn trending<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/coins/trending", &params)
    }

    /// Get a single coin by slug. Params: locale.
    pub fn get<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
        self.http.get(&format!("/api/v1/coins/{}", enc(slug)), &params)
    }

    /// OHLC candle history. Params: interval, start, end, limit.
    pub fn history<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
        self.http.get(&format!("/api/v1/coins/{}/history", enc(slug)), &params)
    }

    /// Marketcap history. Params: interval, start, end, limit.
    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)), &params)
    }

    /// Price sparkline. Params: period.
    pub fn sparkline<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
        self.http.get(&format!("/api/v1/coins/{}/sparkline", enc(slug)), &params)
    }
}

/// Lightweight price lookups.
pub struct Prices {
    http: Arc<HttpClient>,
}

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

    /// Get prices for many coins at once. Params: ids, slugs, symbols, convert.
    pub fn list<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/prices", &params)
    }

    /// Get the price of a single coin. Params: convert.
    pub fn get<T: DeserializeOwned>(&self, slug: &str, params: Params) -> Result<T, Error> {
        self.http.get(&format!("/api/v1/prices/{}", enc(slug)), &params)
    }

    /// Historical price of a coin on a date. Params: slug, date.
    pub fn historical<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/historical-price", &params)
    }
}

/// Asset conversion and reference rates.
pub struct Conversion {
    http: Arc<HttpClient>,
}

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

    /// Convert an amount between two assets. Params: from, to, amount.
    pub fn convert<T: DeserializeOwned>(&self, params: Params) -> Result<T, Error> {
        self.http.get("/api/v1/convert", &params)
    }

    /// List supported fiat currencies.
    pub fn fiats<T: DeserializeOwned>(&self) -> Result<T, Error> {
        self.http.get("/api/v1/fiats", &Params::new())
    }

    /// List conversion rates.
    pub fn rates<T: DeserializeOwned>(&self) -> Result<T, Error> {
        self.http.get("/api/v1/rates", &Params::new())
    }
}