rust_gecko/
coins.rs

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", &params);
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", &params);
77    response
78}
79
80/// Get current data (name, price, market, ... including exchange tickers) for a coin.
81pub 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(&params, tik, Some("tickers=true"), Some("tickers=false"));
104    params = gecko::append_if(
105        &params,
106        m_d,
107        Some("market_data=true"),
108        Some("market_data=false"),
109    );
110    params = gecko::append_if(
111        &params,
112        c_d,
113        Some("community_data=true"),
114        Some("community_data=false"),
115    );
116    params = gecko::append_if(
117        &params,
118        d_d,
119        Some("developer_data=true"),
120        Some("developer_data=false"),
121    );
122    params = gecko::append_if(
123        &params,
124        spk,
125        Some("sparkline=true"),
126        Some("sparkline=false"),
127    );
128
129    let response = gecko::get_request(&["/coins", id].join("/"), &params);
130    response
131}
132
133/// Get coin tickers
134pub 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        &params,
153        include_exchange_logo.unwrap_or(false),
154        Some(&"include_exchange_logo"),
155        None,
156    );
157
158    params = gecko::append_if(
159        &params,
160        !page.is_none(),
161        Some(&["page", &page.unwrap_or(0).to_string()].join("=")),
162        None,
163    );
164
165    params = gecko::append_if(
166        &params,
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(&params, depth.unwrap_or(false), Some("depth=true"), None);
178
179    let response = gecko::get_request(&["/coins", id, "tickers"].join("/"), &params);
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        &params,
187        localization.unwrap_or(false),
188        Some("&localization"),
189        None,
190    );
191    let response = gecko::get_request(&["/coins", id, "history"].join("/"), &params);
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("/"), &params);
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}