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 {
    last: f32,
    pub high: f32,
    pub low: f32,
    pub vwap: f32,
    pub volume: f32,
    bid: f32,
    ask: f32,
}

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

pub fn ticker(pair: Pair) -> Result<Ticker, TickerError> {
    let pair_str = match pair {
        (Currency::BTC, Currency::JPY) => "btc_jpy",
        (Currency::MONA, Currency::JPY) => "mona_jpy",
        (Currency::BTC, Currency::MONA) => "btc_mona",
        _ => return Err(TickerError::NotSupportPair),
    };
    let version = 1;
    let base_url = "https://api.zaif.jp/api";
    let url_string = format!("{}/{}/ticker/{}", base_url, version, pair_str);
    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());
    }
}