Skip to main content

faker_rust/default/
finance.rs

1//! Finance generator - generates finance-related data
2
3use crate::base::sample;
4use crate::locale::fetch_locale;
5
6/// Generate a random stock ticker symbol
7pub fn stock_ticker() -> String {
8    fetch_locale("finance.stock_tickers", "en")
9        .map(|v| sample(&v))
10        .unwrap_or_else(generate_ticker)
11}
12
13fn generate_ticker() -> String {
14    let config = crate::config::FakerConfig::current();
15    const LETTERS: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
16    let length = config.rand_range(2, 5);
17    let mut ticker = String::new();
18    for _ in 0..length {
19        let idx = config.rand_range(0, 26) as usize;
20        ticker.push(LETTERS[idx] as char);
21    }
22    ticker
23}
24
25/// Generate a random market index
26pub fn market_index() -> String {
27    fetch_locale("finance.market_indices", "en")
28        .map(|v| sample(&v))
29        .unwrap_or_else(|| sample(FALLBACK_INDICES).to_string())
30}
31
32/// Generate a random currency pair
33pub fn currency_pair() -> String {
34    let base = sample(FALLBACK_CURRENCIES);
35    let quote = sample(FALLBACK_CURRENCIES);
36    format!("{}/{})", base, quote)
37}
38
39// Fallback data
40const FALLBACK_INDICES: &[&str] = &[
41    "S&P 500", "Dow Jones", "NASDAQ", "Russell 2000", "FTSE 100",
42    "DAX", "Nikkei 225", "Hang Seng", "Shanghai Composite", "CAC 40",
43    "Euro Stoxx 50", "IBOVESPA", "ASX 200", "TSX Composite",
44];
45
46const FALLBACK_CURRENCIES: &[&str] = &[
47    "USD", "EUR", "GBP", "JPY", "CHF", "CAD", "AUD", "NZD",
48    "CNY", "HKD", "SGD", "MXN", "BRL", "INR", "RUB", "ZAR",
49    "KRW", "SEK", "NOK", "DKK", "PLN", "TRY", "AED", "THB",
50];
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn test_stock_ticker() {
58        assert!(!stock_ticker().is_empty());
59    }
60
61    #[test]
62    fn test_market_index() {
63        assert!(!market_index().is_empty());
64    }
65
66    #[test]
67    fn test_currency_pair() {
68        assert!(!currency_pair().is_empty());
69    }
70}