bitculator 1.1.0

Official Rust SDK for the Bitculator Data API
Documentation
// Run with: BITCULATOR_API_KEY=... cargo run --example quickstart
// (against local dev, add BITCULATOR_BASE_URL=http://localhost)

// The SDK returns `Error` by value — a deliberate trade-off kept for the
// published 1.0 API (see lib.rs).
#![allow(clippy::result_large_err)]

use bitculator::{Client, Error, Page, Params};
use serde_json::Value;

fn main() -> Result<(), Error> {
    let key = std::env::var("BITCULATOR_API_KEY").unwrap_or_default();
    let base =
        std::env::var("BITCULATOR_BASE_URL").unwrap_or_else(|_| "https://bitculator.com".into());
    let client = Client::builder(key).base_url(base).build();

    client.meta().ping::<Value>()?;

    // Single resource, decoded as generic JSON (or bring your own type).
    let bitcoin: Value = client.coins().get("bitcoin", Params::new())?;
    println!("BTC price: {}", bitcoin["price"]); // decimal string, never rounded

    // Top 5 coins by marketcap.
    let page: Page<Value> = client
        .coins()
        .list(Params::new().set("per_page", 5).set("sort", "-marketcap"))?;
    for coin in &page.data {
        println!("#{} {} {}", coin["rank"], coin["symbol"], coin["price"]);
    }

    // Auto-paginate the first ~40 gainers.
    let gainers: Page<Value> = client.coins().gainers(Params::new().set("per_page", 20))?;
    for (i, item) in gainers.auto_paging().enumerate() {
        let coin = item?;
        println!("gainer: {}", coin["symbol"]);
        if i >= 39 {
            break;
        }
    }

    println!("quota: {:?}", client.quota());
    Ok(())
}