Skip to main content

basic/
basic.rs

1//! Basic usage example for the Exchange Rate API Rust SDK.
2//!
3//! Run with:
4//!   cargo run --example basic
5//!
6//! Make sure to set the EXCHANGE_RATE_API_KEY environment variable first:
7//!   export EXCHANGE_RATE_API_KEY="era_live_your_api_key"
8
9use exchange_rateapi::{ExchangeRateAPI, Period};
10
11fn main() {
12    // Read API key from environment
13    let api_key = std::env::var("EXCHANGE_RATE_API_KEY")
14        .expect("Set EXCHANGE_RATE_API_KEY environment variable");
15
16    let client = ExchangeRateAPI::new(&api_key);
17
18    // -----------------------------------------------------------------------
19    // 1. Get latest rates
20    // -----------------------------------------------------------------------
21    println!("--- Latest Rates (USD) ---");
22    match client.latest("USD", Some("EUR,GBP,JPY,CAD")) {
23        Ok(resp) => {
24            for (currency, rate) in &resp.rates {
25                println!("  {} = {}", currency, rate);
26            }
27        }
28        Err(e) => eprintln!("Error: {}", e),
29    }
30
31    // -----------------------------------------------------------------------
32    // 2. Convert currency
33    // -----------------------------------------------------------------------
34    println!("\n--- Convert 100 USD to EUR ---");
35    match client.convert("USD", "EUR", 100.0) {
36        Ok(resp) => {
37            println!("  {} {} = {} {}", resp.amount, resp.from, resp.result, resp.to);
38            println!("  Rate: {}", resp.rate);
39        }
40        Err(e) => eprintln!("Error: {}", e),
41    }
42
43    // -----------------------------------------------------------------------
44    // 3. Get a single exchange rate
45    // -----------------------------------------------------------------------
46    println!("\n--- Single Rate: GBP/JPY ---");
47    match client.get_rate("GBP", "JPY") {
48        Ok(rate) => println!("  1 GBP = {} JPY", rate),
49        Err(e) => eprintln!("Error: {}", e),
50    }
51
52    // -----------------------------------------------------------------------
53    // 4. Historical rates for a specific date
54    // -----------------------------------------------------------------------
55    println!("\n--- Historical Rates (2025-01-15, EUR base) ---");
56    match client.for_date("2025-01-15", "EUR", Some("USD,GBP")) {
57        Ok(resp) => {
58            println!("  Date: {}", resp.date);
59            for (currency, rate) in &resp.rates {
60                println!("  {} = {}", currency, rate);
61            }
62        }
63        Err(e) => eprintln!("Error: {}", e),
64    }
65
66    // -----------------------------------------------------------------------
67    // 5. Time series
68    // -----------------------------------------------------------------------
69    println!("\n--- Time Series (USD/EUR, Jan 2025) ---");
70    match client.time_series("2025-01-01", "2025-01-07", "USD", Some("EUR")) {
71        Ok(resp) => {
72            let mut dates: Vec<&String> = resp.rates.keys().collect();
73            dates.sort();
74            for date in dates {
75                if let Some(rate) = resp.rates[date].get("EUR") {
76                    println!("  {}: EUR = {}", date, rate);
77                }
78            }
79        }
80        Err(e) => eprintln!("Error: {}", e),
81    }
82
83    // -----------------------------------------------------------------------
84    // 6. List all symbols
85    // -----------------------------------------------------------------------
86    println!("\n--- Supported Currencies (first 10) ---");
87    match client.symbols() {
88        Ok(resp) => {
89            let mut symbols: Vec<(&String, &String)> = resp.symbols.iter().collect();
90            symbols.sort_by_key(|(code, _)| code.to_owned());
91            for (code, name) in symbols.iter().take(10) {
92                println!("  {}: {}", code, name);
93            }
94            println!("  ... and {} more", resp.symbols.len().saturating_sub(10));
95        }
96        Err(e) => eprintln!("Error: {}", e),
97    }
98
99    // -----------------------------------------------------------------------
100    // 7. Historical rates with preset period
101    // -----------------------------------------------------------------------
102    println!("\n--- Last 7 Days: USD/EUR ---");
103    match client.get_historical_rates("USD", "EUR", Period::SevenDays) {
104        Ok(resp) => {
105            let mut dates: Vec<&String> = resp.rates.keys().collect();
106            dates.sort();
107            for date in dates {
108                if let Some(rate) = resp.rates[date].get("EUR") {
109                    println!("  {}: {}", date, rate);
110                }
111            }
112        }
113        Err(e) => eprintln!("Error: {}", e),
114    }
115}