use crate::config::ProvidersConfig;
use crate::models::TimeRange;
use crate::pricing::{ModelPricingMap, fetch_model_pricing};
use crate::usage::{
UsageCollection, UsageScanOptions, aggregate_usage_from_home_with_diagnostics_opts,
};
use anyhow::Result;
use std::collections::HashMap;
use std::sync::Arc;
pub struct PricedUsageScan {
pub collection: UsageCollection,
pub pricing: ModelPricingMap,
pub pricing_error: Option<String>,
}
pub fn scan_usage_priced(
time_range: TimeRange,
providers: ProvidersConfig,
pool: &rayon::ThreadPool,
) -> Result<PricedUsageScan> {
let (pricing, pricing_error) = match fetch_model_pricing() {
Ok(map) => (map, None),
Err(e) => {
log::warn!("failed to fetch pricing data: {e}; costs unavailable");
(ModelPricingMap::new(HashMap::new()), Some(e.to_string()))
}
};
let options = UsageScanOptions {
tiers: Some(Arc::new(pricing.tier_thresholds())),
};
let collection = pool.install(|| {
aggregate_usage_from_home_with_diagnostics_opts(time_range, providers, &options)
})?;
Ok(PricedUsageScan {
collection,
pricing,
pricing_error,
})
}