Skip to main content

quickstart/
quickstart.rs

1// Run with: BITCULATOR_API_KEY=... cargo run --example quickstart
2// (against local dev, add BITCULATOR_BASE_URL=http://localhost)
3
4// The SDK returns `Error` by value — a deliberate trade-off kept for the
5// published 1.0 API (see lib.rs).
6#![allow(clippy::result_large_err)]
7
8use bitculator::{Client, Error, Page, Params};
9use serde_json::Value;
10
11fn main() -> Result<(), Error> {
12    let key = std::env::var("BITCULATOR_API_KEY").unwrap_or_default();
13    let base =
14        std::env::var("BITCULATOR_BASE_URL").unwrap_or_else(|_| "https://bitculator.com".into());
15    let client = Client::builder(key).base_url(base).build();
16
17    client.meta().ping::<Value>()?;
18
19    // Single resource, decoded as generic JSON (or bring your own type).
20    let bitcoin: Value = client.coins().get("bitcoin", Params::new())?;
21    println!("BTC price: {}", bitcoin["price"]); // decimal string, never rounded
22
23    // Top 5 coins by marketcap.
24    let page: Page<Value> = client
25        .coins()
26        .list(Params::new().set("per_page", 5).set("sort", "-marketcap"))?;
27    for coin in &page.data {
28        println!("#{} {} {}", coin["rank"], coin["symbol"], coin["price"]);
29    }
30
31    // Auto-paginate the first ~40 gainers.
32    let gainers: Page<Value> = client.coins().gainers(Params::new().set("per_page", 20))?;
33    for (i, item) in gainers.auto_paging().enumerate() {
34        let coin = item?;
35        println!("gainer: {}", coin["symbol"]);
36        if i >= 39 {
37            break;
38        }
39    }
40
41    println!("quota: {:?}", client.quota());
42    Ok(())
43}