use crate::error::*;
use metfor::{Celsius, CelsiusDiff, HectoPascal, JpKg, Kelvin, Mm};
use optional::{none, Optioned};
#[derive(Debug)]
pub struct Indexes {
pub show: Optioned<CelsiusDiff>, pub li: Optioned<CelsiusDiff>, pub swet: Optioned<f64>, pub kinx: Optioned<Celsius>, pub lclp: Optioned<HectoPascal>, pub pwat: Optioned<Mm>, pub totl: Optioned<f64>, pub cape: Optioned<JpKg>, pub lclt: Optioned<Kelvin>, pub cins: Optioned<JpKg>, pub eqlv: Optioned<HectoPascal>, pub lfc: Optioned<HectoPascal>, pub brch: Optioned<f64>, }
impl Indexes {
pub fn parse(src: &str) -> Result<Indexes, BufkitFileError> {
use crate::parse_util::parse_f64;
let (show, head) = parse_f64(src, "SHOW").unwrap_or((none(), src));
let (lift, head) = parse_f64(head, "LIFT").unwrap_or((none(), head));
let (swet, head) = parse_f64(head, "SWET").unwrap_or((none(), head));
let (kinx, head) = parse_f64(head, "KINX").unwrap_or((none(), head));
let (lclp, head) = parse_f64(head, "LCLP").unwrap_or((none(), head));
let (pwat, head) = parse_f64(head, "PWAT").unwrap_or((none(), head));
let (totl, head) = parse_f64(head, "TOTL").unwrap_or((none(), head));
let (cape, head) = parse_f64(head, "CAPE").unwrap_or((none(), head));
let (lclt, head) = parse_f64(head, "LCLT").unwrap_or((none(), head));
let (cins, head) = parse_f64(head, "CINS").unwrap_or((none(), head));
let (eqlv, head) = parse_f64(head, "EQLV").unwrap_or((none(), head));
let (lfct, head) = parse_f64(head, "LFCT").unwrap_or((none(), head));
let (brch, _) = parse_f64(head, "BRCH").unwrap_or((none(), head));
Ok(Indexes {
show: show.map_t(CelsiusDiff),
li: lift.map_t(CelsiusDiff),
swet,
kinx: kinx.map_t(Celsius),
lclp: lclp.map_t(HectoPascal),
pwat: pwat.map_t(Mm),
totl,
cape: cape.map_t(JpKg),
lclt: lclt.map_t(Kelvin),
cins: cins.map_t(JpKg),
eqlv: eqlv.map_t(HectoPascal),
lfc: lfct.map_t(HectoPascal),
brch,
})
}
}
#[test]
fn test_indexes_parse() {
use optional::some;
let test_data = "
SHOW = 8.12 LIFT = 8.00 SWET = 39.08 KINX = 14.88
LCLP = 780.77 PWAT = 9.28 TOTL = 39.55 CAPE = 0.00
LCLT = 272.88 CINS = 0.00 EQLV = -9999.00 LFCT = -9999.00
BRCH = 0.00";
let indexes = Indexes::parse(&test_data);
println!("indexes: {:?}", indexes);
let Indexes {
show,
li,
swet,
kinx,
lclp,
pwat,
totl,
cape,
lclt,
cins,
eqlv,
lfc,
brch,
} = indexes.unwrap();
assert_eq!(show, some(CelsiusDiff(8.12)));
assert_eq!(li, some(CelsiusDiff(8.0)));
assert_eq!(swet, some(39.08));
assert_eq!(kinx, some(Celsius(14.88)));
assert_eq!(lclp, some(HectoPascal(780.77)));
assert_eq!(pwat, some(Mm(9.28)));
assert_eq!(totl, some(39.55));
assert_eq!(cape, some(JpKg(0.00)));
assert_eq!(lclt, some(Kelvin(272.88)));
assert_eq!(cins, some(JpKg(0.00)));
assert!(eqlv.is_none());
assert!(lfc.is_none());
assert_eq!(brch, some(0.00));
let test_data = "
SHOW = 9.67 LIFT = 9.84 SWET = 33.41 KINX = 3.88
LCLP = 822.95 PWAT = 9.52 TOTL = 37.25 CAPE = 0.00
LCLT = 273.49 CINS = 0.00 EQLV = -9999.00 LFCT = -9999.00
BRCH = 0.00";
let indexes = Indexes::parse(&test_data);
println!("indexes: {:?}", indexes);
let Indexes {
show,
li,
swet,
kinx,
lclp,
pwat,
totl,
cape,
lclt,
cins,
eqlv,
lfc,
brch,
} = indexes.unwrap();
assert_eq!(show, some(CelsiusDiff(9.67)));
assert_eq!(li, some(CelsiusDiff(9.84)));
assert_eq!(swet, some(33.41));
assert_eq!(kinx, some(Celsius(3.88)));
assert_eq!(lclp, some(HectoPascal(822.95)));
assert_eq!(pwat, some(Mm(9.52)));
assert_eq!(totl, some(37.25));
assert_eq!(cape, some(JpKg(0.00)));
assert_eq!(lclt, some(Kelvin(273.49)));
assert_eq!(cins, some(JpKg(0.00)));
assert!(eqlv.is_none());
assert!(lfc.is_none());
assert_eq!(brch, some(0.00));
}