hafas_rs/parse/
load_factor.rs

1use crate::LoadFactor;
2use crate::ParseResult;
3use crate::Profile;
4use crate::TariffClass;
5use serde::Deserialize;
6
7#[derive(Debug, Clone, Deserialize)]
8#[serde(rename_all = "UPPERCASE")]
9pub enum HafasTariffClass {
10    First,
11    Second,
12}
13
14impl From<HafasTariffClass> for TariffClass {
15    fn from(h: HafasTariffClass) -> TariffClass {
16        match h {
17            HafasTariffClass::First => TariffClass::First,
18            HafasTariffClass::Second => TariffClass::Second,
19        }
20    }
21}
22
23pub type HafasLoadFactor = u8;
24
25#[derive(Debug, Clone, Deserialize)]
26pub struct HafasLoadFactorEntry {
27    c: HafasTariffClass,
28    r: HafasLoadFactor,
29}
30
31#[derive(Debug, Clone)]
32pub struct LoadFactorEntry {
33    pub class: TariffClass,
34    pub load: LoadFactor,
35}
36
37pub fn default_parse_load_factor_entry<P: Profile + ?Sized>(
38    profile: &P,
39    h: HafasLoadFactorEntry,
40) -> ParseResult<LoadFactorEntry> {
41    Ok(LoadFactorEntry {
42        class: h.c.into(),
43        load: profile.parse_load_factor(h.r)?,
44    })
45}
46
47pub fn default_parse_load_factor(h: HafasLoadFactor) -> ParseResult<LoadFactor> {
48    match h {
49        1 => Ok(LoadFactor::LowToMedium),
50        2 => Ok(LoadFactor::High),
51        3 => Ok(LoadFactor::VeryHigh),
52        4 => Ok(LoadFactor::ExceptionallyHigh),
53        _ => Err(format!("Invalid load factor: {}", h).into()),
54    }
55}