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
use exchange_rate;
use failure::Error;
use reqwest;
use time_series;
const URL_ENDPOINT: &str = "https://www.alphavantage.co/query";
pub struct Client {
key: String,
client: reqwest::Client,
}
impl Client {
pub fn new(key: &str) -> Client {
let client = reqwest::Client::new();
Client {
key: String::from(key),
client,
}
}
pub fn get_time_series_intraday(
&self,
symbol: &str,
interval: time_series::IntradayInterval,
) -> Result<time_series::TimeSeries, Error> {
let function = time_series::Function::IntraDay(interval);
self.get_time_series(&function, symbol)
}
pub fn get_time_series_daily(&self, symbol: &str) -> Result<time_series::TimeSeries, Error> {
let function = time_series::Function::Daily;
self.get_time_series(&function, symbol)
}
pub fn get_time_series_weekly(&self, symbol: &str) -> Result<time_series::TimeSeries, Error> {
let function = time_series::Function::Weekly;
self.get_time_series(&function, symbol)
}
pub fn get_time_series_montly(&self, symbol: &str) -> Result<time_series::TimeSeries, Error> {
let function = time_series::Function::Monthly;
self.get_time_series(&function, symbol)
}
pub fn get_exchange_rate(
&self,
from_currency_code: &str,
to_currency_code: &str,
) -> Result<exchange_rate::ExchangeRate, Error> {
let function = "CURRENCY_EXCHANGE_RATE";
let params = vec![
("from_currency", from_currency_code),
("to_currency", to_currency_code),
];
let response = self.api_call(function, ¶ms)?;
let result = exchange_rate::parser::parse(response)?;
Ok(result)
}
fn get_time_series(
&self,
function: &time_series::Function,
symbol: &str,
) -> Result<time_series::TimeSeries, Error> {
let mut params = vec![("symbol", symbol)];
if let time_series::Function::IntraDay(interval) = function {
params.push(("interval", interval.to_string()));
}
let response = self.api_call(function.to_string(), ¶ms)?;
let result = time_series::parser::parse(function, response)?;
Ok(result)
}
fn api_call(
&self,
function: &str,
params: &[(&str, &str)],
) -> Result<reqwest::Response, reqwest::Error> {
let mut query = vec![("function", function), ("apikey", &self.key)];
query.extend(params);
self.client.get(URL_ENDPOINT).query(&query).send()
}
}