diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 44f8bd8..d89afcb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1094,6 +1094,21 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -1101,6 +1116,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -1168,6 +1184,7 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -3710,6 +3727,7 @@ name = "summarum" version = "1.2.0" dependencies = [ "chrono", + "futures", "reqwest 0.12.28", "serde", "serde_json", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index c71d21f..b0b86ea 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,6 +20,7 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } chrono = "0.4" +futures = "0.3.32" [profile.release] strip = true diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 4fd3982..c1a1651 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -295,22 +295,33 @@ async fn fetch_market_data( // v7/finance/quote now requires a cookie+crumb pair Yahoo stopped issuing // to plain API clients (returns 401); v8 chart still answers anonymously, // one symbol per request. - let mut prices = std::collections::HashMap::new(); - for sym in &symbols { - let url = format!( - "https://query1.finance.yahoo.com/v8/finance/chart/{}?range=1d&interval=1d", - sym - ); - let Ok(resp) = client.get(&url).send().await else { - continue; - }; - let Ok(body) = resp.json::().await else { - continue; - }; - if let Some(price) = body["chart"]["result"][0]["meta"]["regularMarketPrice"].as_f64() { - if price > 0.0 { - prices.insert(sym.clone(), price); + let futures_reqs = symbols.iter().map(|sym| { + let client = client.clone(); + async move { + let url = format!( + "https://query1.finance.yahoo.com/v8/finance/chart/{}?range=1d&interval=1d", + sym + ); + if let Ok(resp) = client.get(&url).send().await { + if let Ok(body) = resp.json::().await { + if let Some(price) = + body["chart"]["result"][0]["meta"]["regularMarketPrice"].as_f64() + { + if price > 0.0 { + return Some((sym.clone(), price)); + } + } + } } + None + } + }); + + let mut prices = std::collections::HashMap::new(); + let results = futures::future::join_all(futures_reqs).await; + for res in results { + if let Some((sym, price)) = res { + prices.insert(sym, price); } }