1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
#![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) }