1use super::read_csv_id_file;
3use crate::commodity::{BalanceType, Commodity, CommodityID, CommodityMap};
4use crate::region::RegionID;
5use crate::time_slice::TimeSliceInfo;
6use anyhow::Result;
7use indexmap::IndexSet;
8use std::path::Path;
9
10mod levy;
11use levy::read_commodity_levies;
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: &IndexSet<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_levies(
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(mut costs) = costs.remove(&id) {
60 if let Some(levies) = costs.remove(&BalanceType::Consumption) {
61 commodity.levies_cons = levies;
62 }
63 if let Some(levies) = costs.remove(&BalanceType::Production) {
64 commodity.levies_prod = levies;
65 }
66 }
67 if let Some(demand) = demand.remove(&id) {
68 commodity.demand = demand;
69 }
70
71 (id, commodity.into())
72 })
73 .collect())
74}