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,
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());
}
}