dinzai-datni 0.1.1

Cryptocurrency ticker library for Rust.
use rustc_serialize::json;
use rustc_serialize::Decodable;
use core;
use core::{Currency, Pair, TickerError};

#[derive(RustcEncodable, RustcDecodable, Debug)]
pub struct Ticker {
    pub product_code: String,
    pub timestamp: String,
    pub tick_id: u32,
    best_bid: f32,
    best_ask: f32,
    pub best_bid_size: f32,
    pub best_ask_size: f32,
    pub total_bid_depth: f32,
    pub total_ask_depth: f32,
    // LastPrice
    ltp: f32,
    pub volume: f32,
}

impl core::Ticker for Ticker {
    fn last(&self) -> f32 {
        self.ltp
    }
    fn bid(&self) -> f32 {
        self.best_bid
    }
    fn ask(&self) -> f32 {
        self.best_ask
    }
}

pub fn ticker(pair: Pair) -> Result<Ticker, TickerError> {
    let product_code = match pair {
        (Currency::BTC, Currency::JPY) => "BTC_JPY",
        (Currency::FXBTC, Currency::JPY) => "FX_BTC_JPY",
        _ => return Err(TickerError::NotSupportPair),
    };
    let version = 1;
    let base_url = "https://api.bitflyer.jp/";
    let url_string = format!("{}/v{}/getticker?product_code={}", base_url, version, product_code);
    let json = core::get_json(&url_string);
    let mut decoder = json::Decoder::new(json);
    let result = Ticker::decode(&mut decoder);
    match  result {
        Ok(x) => Ok(x),
        Err(e) => Err(TickerError::DecoderError(e)),
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use core::Currency;

    #[test]
    fn test_ticker_okay() {
        let pair = (Currency::BTC, Currency::JPY);
        let ticker = ticker(pair);
        assert!(ticker.is_ok());
        println!("{:?}", ticker.ok().unwrap());
    }

    #[test]
    fn test_ticker_invalid_pair() {
        let pair = (Currency::BTC, Currency::USD);
        let ticker = ticker(pair);
        assert!(ticker.is_err());
    }
}