1use super::*;
3use crate::commodity::{Commodity, CommodityID, CommodityMap};
4use crate::region::RegionID;
5use crate::time_slice::TimeSliceInfo;
6use anyhow::Result;
7use std::collections::HashSet;
8use std::path::Path;
9
10mod cost;
11use cost::read_commodity_costs;
12mod demand;
13use demand::read_demand;
14mod demand_slicing;
15
16const COMMODITY_FILE_NAME: &str = "commodities.csv";
17
18pub fn read_commodities(
31 model_dir: &Path,
32 region_ids: &HashSet<RegionID>,
33 time_slice_info: &TimeSliceInfo,
34 milestone_years: &[u32],
35) -> Result<CommodityMap> {
36 let commodities =
37 read_csv_id_file::<Commodity, CommodityID>(&model_dir.join(COMMODITY_FILE_NAME))?;
38 let commodity_ids = commodities.keys().cloned().collect();
39 let mut costs = read_commodity_costs(
40 model_dir,
41 &commodity_ids,
42 region_ids,
43 time_slice_info,
44 milestone_years,
45 )?;
46
47 let mut demand = read_demand(
48 model_dir,
49 &commodities,
50 region_ids,
51 time_slice_info,
52 milestone_years,
53 )?;
54
55 Ok(commodities
57 .into_iter()
58 .map(|(id, mut commodity)| {
59 if let Some(costs) = costs.remove(&id) {
60 commodity.costs = costs;
61 }
62 if let Some(demand) = demand.remove(&id) {
63 commodity.demand = demand;
64 }
65
66 (id, commodity.into())
67 })
68 .collect())
69}