⚡ Optimize historical rates batch fetching with API range query

Replaced individual Frankfurter API requests with a single batched range query in fetch_historical_rates_batch. Added fallback logic to handle missing weekend/holiday dates.
Ran cargo fmt to resolve CI formatting failures.

Co-authored-by: Horizontal42 <75383519+Horizontal42@users.noreply.github.com>
This commit is contained in:
google-labs-jules[bot] 2026-08-26 14:22:23 +00:00
parent 845bc3d484
commit da0c8edb8c
2 changed files with 14 additions and 6 deletions

View file

@ -1 +0,0 @@
// Wait, we can just write a quick script to benchmark it from JS or Rust

View file

@ -662,13 +662,19 @@ async fn fetch_historical_rates_batch(
available_dates.sort();
for req_date_str in missing_dates {
if let Ok(req_date) = chrono::NaiveDate::parse_from_str(&req_date_str, "%Y-%m-%d") {
if let Ok(req_date) =
chrono::NaiveDate::parse_from_str(&req_date_str, "%Y-%m-%d")
{
// Find the exact date or the closest preceding date
let matched_date_str = match available_dates.binary_search(&req_date) {
Ok(idx) => Some(available_dates[idx].format("%Y-%m-%d").to_string()),
Ok(idx) => {
Some(available_dates[idx].format("%Y-%m-%d").to_string())
}
Err(idx) => {
if idx > 0 {
Some(available_dates[idx - 1].format("%Y-%m-%d").to_string())
Some(
available_dates[idx - 1].format("%Y-%m-%d").to_string(),
)
} else {
None
}
@ -676,9 +682,12 @@ async fn fetch_historical_rates_batch(
};
if let Some(matched_date) = matched_date_str {
if let Some(matched_rates_obj) = rates_obj.get(&matched_date).and_then(|r| r.as_object()) {
if let Some(matched_rates_obj) =
rates_obj.get(&matched_date).and_then(|r| r.as_object())
{
let daily_rates = parse_rate_map(matched_rates_obj);
let cache_path = data_dir(&app).join(format!("rates-{}.json", req_date_str));
let cache_path =
data_dir(&app).join(format!("rates-{}.json", req_date_str));
if let Ok(serialized) = serde_json::to_string(&daily_rates) {
write_atomic_async(cache_path, serialized).await;
}