cryptocompare 0.1.0

An rust API-Wrapper for the CryptoCompare API.
Documentation

#![feature(try_trait)]

extern crate reqwest;
extern crate serde_json;
extern crate time;

use serde_json::Value;
use std::io::Read;

static BASE_URL: &str = "https://min-api.cryptocompare.com/data/";

pub struct Options<'a> {
    pub exchanges: &'a str,
    pub try_conversion: bool
}

#[derive(Debug)]
pub struct Dataset {
    pub close: f64,
    pub high: f64,
    pub low: f64,
    pub open: f64,
    pub time: i64,
    pub volumefrom: f64,
    pub volumeto: f64
}

pub fn get_coin_list() -> Result<serde_json::Value, Box<::std::error::Error>> {
    let url = format!("{}all/coinlist", BASE_URL);

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_price(fsym: &str, tsyms: &str, options: &Options) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}price?fsym={}&tsyms={}", BASE_URL, fsym, tsyms);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_price_multi(fsyms: &str, tsyms: &str, options: &Options) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}pricemulti?fsyms={}&tsyms={}", BASE_URL, fsyms, tsyms);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_price_multi_full(fsyms: &str, tsyms: &str, options: &Options) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}pricemultifull?fsyms={}&tsyms={}", BASE_URL, fsyms, tsyms);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_price_historical(fsym: &str, tsyms: &str, options: &Options) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}pricehistorical?fsym={}&tsyms={}&ts={}", BASE_URL, fsym, tsyms, time::get_time().sec);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_history_day(fsym: &str, tsym: &str, options: &Options, limit: &u64) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}histoday?fsym={}&tsym={}&limit={}&aggregate=1", BASE_URL, fsym, tsym, limit);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_history_hour(fsym: &str, tsym: &str, options: &Options, limit: &u64) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}histohour?fsym={}&tsym={}&limit={}&aggregate=1", BASE_URL, fsym, tsym, limit);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn get_history_minute(fsym: &str, tsym: &str, options: &Options, limit: &u64) -> Result<serde_json::Value, Box<::std::error::Error>> {
    let mut url = format!("{}histominute?fsym={}&tsym={}&limit={}&aggregate=1", BASE_URL, fsym, tsym, limit);
    if options.exchanges != "" { url = format!("{}&e={}", url, options.exchanges); }
    if !options.try_conversion { url = format!("{}&tryConversion={}", url, options.try_conversion); }

    let mut result = String::new();
    reqwest::get(&url)?.read_to_string(&mut result)?;
    let value: Value = serde_json::from_str(&mut result)?;

    Ok(value)
}

pub fn parse_json_to_vector(object: Value) -> Result<Vec<Dataset>, Box<::std::option::NoneError>> {
    let mut vector: Vec<Dataset> = Vec::new();
    let array = object.as_object()?["Data"].as_array()?;

    for entry in array {
        let elem = entry.as_object()?;
        vector.push(Dataset {
            close: elem["close"].as_f64()?,
            high: elem["high"].as_f64()?,
            low: elem["low"].as_f64()?,
            open: elem["open"].as_f64()?,
            time: elem["time"].as_i64()?,
            volumefrom: elem["volumefrom"].as_f64()?,
            volumeto: elem["volumeto"].as_f64()?
        })
    }
    Ok(vector)
}

pub fn parse_json_to_float(object: Value, key: &str) -> Result<f64, Box<::std::option::NoneError>> {
    let value = object.as_object()?[key].as_f64()?;
    Ok(value)
}