coinpaprika_api/tickers/
mod.rs1use crate::client::{Client, Response};
2use crate::error::Error;
3use chrono::prelude::*;
4use reqwest_middleware::RequestBuilder;
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8#[derive(Debug, Serialize, Deserialize)]
9pub struct Ticker {
11 pub id: String,
12 pub name: String,
13 pub symbol: String,
14 pub rank: isize,
15 pub circulating_supply: i64,
16 pub total_supply: i64,
17 pub max_supply: i64,
18 pub beta_value: f64,
19 pub first_data_at: String,
20 pub last_updated: String,
21 pub quotes: Value,
22}
23
24#[derive(Debug, Serialize, Deserialize)]
25pub struct HistoricalTick {
27 pub timestamp: String,
29 pub price: f64,
30 pub volume_24h: i64,
31 pub market_cap: i64,
32}
33
34pub struct GetTickersRequest<'a> {
37 client: &'a Client,
38 quotes: Vec<String>,
39}
40
41impl<'a> GetTickersRequest<'a> {
42 pub fn new(client: &'a Client) -> Self {
43 Self {
44 client,
45 quotes: vec![],
46 }
47 }
48
49 pub fn quotes(&mut self, quotes: Vec<&str>) -> &'a mut GetTickersRequest {
54 self.quotes = quotes.iter().map(|&q| String::from(q)).collect();
55 self
56 }
57
58 pub async fn send(&self) -> Result<Vec<Ticker>, Error> {
59 let query = match self.quotes.len() {
60 0 => vec![],
61 _ => vec![("quotes", self.quotes.join(","))],
62 };
63
64 let request: RequestBuilder = self
65 .client
66 .client
67 .get(format!("{}/tickers", self.client.api_url))
68 .query(&query);
69
70 let response: Response = self.client.request(request).await?;
71
72 let data: Vec<Ticker> = response.response.json().await?;
73
74 Ok(data)
75 }
76}
77
78pub struct GetTickerRequest<'a> {
81 client: &'a Client,
82 coin_id: String,
83 quotes: Vec<String>,
84}
85
86impl<'a> GetTickerRequest<'a> {
87 pub fn new(client: &'a Client, coin_id: &str) -> Self {
88 Self {
89 client,
90 coin_id: String::from(coin_id),
91 quotes: vec![],
92 }
93 }
94
95 pub fn quotes(&mut self, quotes: Vec<&str>) -> &'a mut GetTickerRequest {
100 self.quotes = quotes.iter().map(|&q| String::from(q)).collect();
101 self
102 }
103
104 pub async fn send(&self) -> Result<Ticker, Error> {
105 let query = match self.quotes.len() {
106 0 => vec![],
107 _ => vec![("quotes", self.quotes.join(","))],
108 };
109
110 let request: RequestBuilder = self
111 .client
112 .client
113 .get(format!("{}/tickers/{}", self.client.api_url, self.coin_id))
114 .query(&query);
115
116 let response: Response = self.client.request(request).await?;
117
118 let data: Ticker = response.response.json().await?;
119
120 Ok(data)
121 }
122}
123
124pub struct GetHistoricalTicksRequest<'a> {
127 client: &'a Client,
128 coin_id: String,
129 start: String,
130 end: Option<String>,
131 limit: Option<String>,
132 quote: Option<String>,
133 interval: Option<String>,
134}
135
136impl<'a> GetHistoricalTicksRequest<'a> {
137 pub fn new(client: &'a Client, coin_id: &str) -> Self {
138 let now: DateTime<Utc> = Utc::now(); Self {
141 client,
142 coin_id: String::from(coin_id),
143 start: format!("{}-{}-{}", now.year(), now.month(), now.day()),
144 end: None,
145 limit: None,
146 quote: None,
147 interval: None,
148 }
149 }
150
151 pub fn start(&mut self, start: &str) -> &'a mut GetHistoricalTicksRequest {
158 self.start = String::from(start);
159 self
160 }
161
162 pub fn end(&mut self, end: &str) -> &'a mut GetHistoricalTicksRequest {
171 self.end = Some(String::from(end));
172 self
173 }
174
175 pub fn limit(&mut self, limit: i32) -> &'a mut GetHistoricalTicksRequest {
179 self.limit = Some(limit.to_string());
180 self
181 }
182
183 pub fn quote(&mut self, quote: &str) -> &'a mut GetHistoricalTicksRequest {
187 self.quote = Some(String::from(quote));
188 self
189 }
190
191 pub fn interval(&mut self, interval: &str) -> &'a mut GetHistoricalTicksRequest {
196 self.interval = Some(String::from(interval));
197 self
198 }
199
200 pub async fn send(&self) -> Result<Vec<HistoricalTick>, Error> {
201 let mut query: Vec<(&str, &str)> = vec![("start", self.start.as_ref())];
202
203 if let Some(end) = &self.end {
204 query.push(("end", end));
205 }
206
207 if let Some(limit) = &self.limit {
208 query.push(("limit", limit));
209 }
210
211 if let Some(quote) = &self.quote {
212 query.push(("quote", quote));
213 }
214
215 if let Some(interval) = &self.interval {
216 query.push(("interval", interval));
217 }
218
219 let request: RequestBuilder = self
220 .client
221 .client
222 .get(format!(
223 "{}/tickers/{}/historical",
224 self.client.api_url, self.coin_id
225 ))
226 .query(&query);
227
228 let response: Response = self.client.request(request).await?;
229
230 let data: Vec<HistoricalTick> = response.response.json().await?;
231
232 Ok(data)
233 }
234}