1use crate::patch::FilePatch;
5use anyhow::{Context, Result};
6use std::{collections::BTreeMap, sync::LazyLock};
7
8type PatchMap = BTreeMap<&'static str, (Vec<FilePatch>, Option<&'static str>)>;
10
11static PATCHES: LazyLock<PatchMap> = LazyLock::new(get_all_patches);
13
14fn get_all_patches() -> PatchMap {
16 [
17 (
19 "simple_divisible",
20 (
21 vec![
22 FilePatch::new("processes.csv")
23 .with_deletion("RGASBR,Gas boiler,all,RSHEAT,2020,2040,1.0,")
24 .with_addition("RGASBR,Gas boiler,all,RSHEAT,2020,2040,1.0,1000"),
25 ],
26 None,
27 ),
28 ),
29 (
31 "simple_npv",
32 (
33 vec![
34 FilePatch::new("agent_objectives.csv")
35 .with_deletion("A0_RES,all,lcox,,")
36 .with_addition("A0_RES,all,npv,,"),
37 ],
38 None,
39 ),
40 ),
41 (
42 "simple_marginal",
44 (
45 vec![FilePatch::new("commodities.csv").with_replacement(&[
46 "id,description,type,time_slice_level,pricing_strategy,units",
47 "GASPRD,Gas produced,sed,season,shadow,PJ",
48 "GASNAT,Natural gas,sed,season,shadow,PJ",
49 "ELCTRI,Electricity,sed,daynight,marginal,PJ",
50 "RSHEAT,Residential heating,svd,daynight,shadow,PJ",
51 "CO2EMT,CO2 emitted,oth,annual,unpriced,ktCO2",
52 ])],
53 None,
54 ),
55 ),
56 (
57 "simple_full",
59 (
60 vec![FilePatch::new("commodities.csv").with_replacement(&[
61 "id,description,type,time_slice_level,pricing_strategy,units",
62 "GASPRD,Gas produced,sed,season,full,PJ",
63 "GASNAT,Natural gas,sed,season,full,PJ",
64 "ELCTRI,Electricity,sed,daynight,shadow,PJ",
65 "RSHEAT,Residential heating,svd,daynight,shadow,PJ",
66 "CO2EMT,CO2 emitted,oth,annual,unpriced,ktCO2",
67 ])],
68 None,
69 ),
70 ),
71 (
72 "simple_marginal_average",
74 (
75 vec![FilePatch::new("commodities.csv").with_replacement(&[
76 "id,description,type,time_slice_level,pricing_strategy,units",
77 "GASPRD,Gas produced,sed,season,shadow,PJ",
78 "GASNAT,Natural gas,sed,season,shadow,PJ",
79 "ELCTRI,Electricity,sed,daynight,marginal_average,PJ",
80 "RSHEAT,Residential heating,svd,daynight,shadow,PJ",
81 "CO2EMT,CO2 emitted,oth,annual,unpriced,ktCO2",
82 ])],
83 None,
84 ),
85 ),
86 (
87 "simple_full_average",
89 (
90 vec![FilePatch::new("commodities.csv").with_replacement(&[
91 "id,description,type,time_slice_level,pricing_strategy,units",
92 "GASPRD,Gas produced,sed,season,full_average,PJ",
93 "GASNAT,Natural gas,sed,season,full_average,PJ",
94 "ELCTRI,Electricity,sed,daynight,shadow,PJ",
95 "RSHEAT,Residential heating,svd,daynight,shadow,PJ",
96 "CO2EMT,CO2 emitted,oth,annual,unpriced,ktCO2",
97 ])],
98 None,
99 ),
100 ),
101 (
103 "simple_ironing_out",
104 (vec![], Some("max_ironing_out_iterations = 10")),
105 ),
106 ]
107 .into_iter()
108 .collect()
109}
110
111pub fn get_patch_names() -> impl Iterator<Item = &'static str> {
113 PATCHES.keys().copied()
114}
115
116pub fn get_patches(name: &str) -> Result<&'static (Vec<FilePatch>, Option<&'static str>)> {
118 PATCHES
119 .get(name)
120 .with_context(|| format!("Patched example '{name}' not found"))
121}