pub fn by_name(substance: &str) -> Option<f64> {
Some(match substance {
"CO2" | "carbon dioxide" => 1.0,
"CH4-fossil" | "methane fossil" => 29.8,
"CH4-biogenic" | "methane biogenic" => 27.9,
"N2O" | "nitrous oxide" => 273.0,
"SF6" | "sulphur hexafluoride" => 25_200.0,
"NF3" | "nitrogen trifluoride" => 17_400.0,
"HFC-134a" | "1,1,1,2-tetrafluoroethane" => 1_526.0,
"HFC-32" | "difluoromethane" => 771.0,
"HFC-125" | "pentafluoroethane" => 3_740.0,
"HFC-143a" | "1,1,1-trifluoroethane" => 5_810.0,
"HFC-152a" | "1,1-difluoroethane" => 164.0,
"HFC-227ea" | "1,1,1,2,3,3,3-heptafluoropropane" => 3_600.0,
"HFC-245fa" | "1,1,1,3,3-pentafluoropropane" => 858.0,
"PFC-14" | "CF4" | "tetrafluoromethane" => 7_380.0,
"PFC-116" | "C2F6" | "hexafluoroethane" => 12_400.0,
_ => return None,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn co2_factor_is_one() {
assert_eq!(by_name("CO2"), Some(1.0));
}
#[test]
fn methane_fossil_ar6() {
assert_eq!(by_name("CH4-fossil"), Some(29.8));
}
#[test]
fn methane_biogenic_ef31() {
assert_eq!(by_name("CH4-biogenic"), Some(27.9));
assert_eq!(by_name("methane biogenic"), Some(27.9));
}
#[test]
fn n2o_ar6() {
assert_eq!(by_name("N2O"), Some(273.0));
}
#[test]
fn sf6_is_ar6_value_not_ar5() {
let gwp = by_name("SF6").expect("SF6 must be in the table");
assert!(
(gwp - 25_200.0).abs() < 1.0,
"SF6 GWP100 must be 25_200 (AR6 WG-I Table 7.SM.7), got {gwp}"
);
assert!(
(gwp - 23_500.0).abs() > 1.0,
"SF6 must not be the AR5 value 23_500"
);
assert_eq!(by_name("sulphur hexafluoride"), Some(25_200.0));
}
#[test]
fn hfc_and_pfc_spot_check() {
assert_eq!(by_name("HFC-134a"), Some(1_526.0));
assert_eq!(by_name("HFC-32"), Some(771.0));
assert_eq!(by_name("PFC-14"), Some(7_380.0));
assert_eq!(by_name("CF4"), Some(7_380.0));
}
#[test]
fn unknown_returns_none() {
assert_eq!(by_name("unobtanium"), None);
}
}