1use crate::gecko;
2use crate::types::Response;
3use serde_json;
4pub enum Order {
5 GeckoDesc,
6 GeckoAsc,
7 MarketCapDesc,
8 MarketCapAsc,
9 VolumeDesc,
10 VolumeAsc,
11 IdDesc,
12 IdAsc,
13}
14
15impl Order {
16 fn as_str(&self) -> &'static str {
17 match self {
18 Order::GeckoDesc => "gecko_desc",
19 Order::GeckoAsc => "gecko_asc",
20 Order::MarketCapDesc => "market_cap_desc",
21 Order::MarketCapAsc => "market_cap_asc",
22 Order::VolumeDesc => "volume_desc",
23 Order::VolumeAsc => "volume_asc",
24 Order::IdDesc => "id_desc",
25 Order::IdAsc => "id_asc",
26 }
27 }
28}
29pub enum TickersOrder {
30 TrustScoreDesc,
31 TrustScoreAsc,
32 VolumeDesc,
33}
34
35impl TickersOrder {
36 fn as_str(&self) -> &'static str {
37 match self {
38 TickersOrder::TrustScoreDesc => "trust_score_desc",
39 TickersOrder::TrustScoreAsc => "trust_score_asc",
40 TickersOrder::VolumeDesc => "volume_desc",
41 }
42 }
43}
44
45pub fn list(include_platform: Option<bool>) -> Response<serde_json::Value> {
46 let params = gecko::append_if(
47 &mut String::from("?"),
48 !include_platform.is_none(),
49 Some(&["include_platform", &include_platform.unwrap().to_string()].join("=")),
50 None,
51 );
52 let response = gecko::get_request("/coins/list", ¶ms);
53 response
54}
55
56pub fn markets(
57 vs_currency: &str,
58 ids: Option<Vec<&str>>,
59 category: Option<&str>,
60 order: Option<Order>,
61) -> Response<serde_json::Value> {
62 let mut params = ["?vs_currency", vs_currency].join("=");
63
64 if !ids.is_none() {
65 params.push_str(&["&ids", &gecko::vec_str_2_comma_str(ids.unwrap())].join("="));
66 }
67
68 if !category.is_none() {
69 params.push_str(&["&category", &category.unwrap()].join("="));
70 }
71
72 if !order.is_none() {
73 params.push_str(&["&order", &order.unwrap().as_str()].join("="));
74 }
75
76 let response = gecko::get_request("/coins/markets", ¶ms);
77 response
78}
79
80pub fn get(
82 id: &str,
83 localization: Option<bool>,
84 tickers: Option<bool>,
85 market_data: Option<bool>,
86 community_data: Option<bool>,
87 developer_data: Option<bool>,
88 sparkline: Option<bool>,
89) -> Response<serde_json::Value> {
90 let loc = localization.unwrap_or(true);
91 let tik = tickers.unwrap_or(true);
92 let m_d = market_data.unwrap_or(true);
93 let c_d = community_data.unwrap_or(true);
94 let d_d = developer_data.unwrap_or(true);
95 let spk = sparkline.unwrap_or(false);
96
97 let mut params = gecko::append_if(
98 "?",
99 loc,
100 Some("localization=true"),
101 Some("localization=false"),
102 );
103 params = gecko::append_if(¶ms, tik, Some("tickers=true"), Some("tickers=false"));
104 params = gecko::append_if(
105 ¶ms,
106 m_d,
107 Some("market_data=true"),
108 Some("market_data=false"),
109 );
110 params = gecko::append_if(
111 ¶ms,
112 c_d,
113 Some("community_data=true"),
114 Some("community_data=false"),
115 );
116 params = gecko::append_if(
117 ¶ms,
118 d_d,
119 Some("developer_data=true"),
120 Some("developer_data=false"),
121 );
122 params = gecko::append_if(
123 ¶ms,
124 spk,
125 Some("sparkline=true"),
126 Some("sparkline=false"),
127 );
128
129 let response = gecko::get_request(&["/coins", id].join("/"), ¶ms);
130 response
131}
132
133pub fn tickers(
135 id: &str,
136 exchange_ids: Option<Vec<&str>>,
137 include_exchange_logo: Option<bool>,
138 page: Option<u16>,
139 order: Option<TickersOrder>,
140 depth: Option<bool>,
141) -> Response<serde_json::Value> {
142 let mut params = gecko::append_if(
143 "?",
144 !exchange_ids.is_none(),
145 Some(&gecko::vec_str_2_comma_str(
146 exchange_ids.unwrap_or(vec![""]),
147 )),
148 None,
149 );
150
151 params = gecko::append_if(
152 ¶ms,
153 include_exchange_logo.unwrap_or(false),
154 Some(&"include_exchange_logo"),
155 None,
156 );
157
158 params = gecko::append_if(
159 ¶ms,
160 !page.is_none(),
161 Some(&["page", &page.unwrap_or(0).to_string()].join("=")),
162 None,
163 );
164
165 params = gecko::append_if(
166 ¶ms,
167 !order.is_none(),
168 Some(
169 &[
170 "order",
171 order.unwrap_or(TickersOrder::TrustScoreDesc).as_str(),
172 ]
173 .join("="),
174 ),
175 None,
176 );
177 params = gecko::append_if(¶ms, depth.unwrap_or(false), Some("depth=true"), None);
178
179 let response = gecko::get_request(&["/coins", id, "tickers"].join("/"), ¶ms);
180 response
181}
182
183pub fn history(id: &str, date: &str, localization: Option<bool>) -> Response<serde_json::Value> {
184 let mut params = ["?date", date].join("=");
185 params = gecko::append_if(
186 ¶ms,
187 localization.unwrap_or(false),
188 Some("&localization"),
189 None,
190 );
191 let response = gecko::get_request(&["/coins", id, "history"].join("/"), ¶ms);
192 response
193}
194pub fn market_chart(
195 id: &str,
196 vs_currency: &str,
197 days: &str,
198 interval: Option<&str>,
199) -> Response<serde_json::Value> {
200 let mut params = ["?vs_currency", vs_currency, "&days", days].join("=");
201 if !interval.is_none() {
202 params.push_str(&["&interval", interval.unwrap()].join("="));
203 }
204 let response = gecko::get_request(&["/coins", id, "market_chart"].join("/"), ¶ms);
205 response
206}
207
208pub fn market_chart_range(
209 id: &str,
210 vs_currency: &str,
211 from: &str,
212 to: &str,
213) -> Response<serde_json::Value> {
214 let response = gecko::get_request(
215 &["/coins", id, "market_chart", "range"].join("/"),
216 &["?vs_currency", vs_currency, "&from", from, "&to", to].join("="),
217 );
218 response
219}
220
221pub fn ohlc(id: &str, vs_currency: &str, days: &str) -> Response<serde_json::Value> {
222 let response = gecko::get_request(
223 &["/coins", id, "ohlc"].join("/"),
224 &["?vs_currency", vs_currency, "&days", days].join("="),
225 );
226 response
227}