muse2/input/
commodity.rs

1//! Code for reading in commodity-related data from CSV files.
2use 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
18/// Read commodity data from the specified model directory.
19///
20/// # Arguments
21///
22/// * `model_dir` - Folder containing model configuration files
23/// * `region_ids` - All possible region IDs
24/// * `time_slice_info` - Information about time slices
25/// * `milestone_years` - All milestone years
26///
27/// # Returns
28///
29/// A map containing commodities, grouped by commodity ID or an error.
30pub 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    // Populate maps for each Commodity
56    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}